EPPlus - Baca Tabel Excel

Dengan menggunakan EPPlus, saya ingin membaca tabel excel, lalu menyimpan semua konten dari setiap kolom ke dalam Daftar yang sesuai. Saya ingin ia mengenali judul tabel dan mengkategorikan isinya berdasarkan itu.

Sebagai contoh, jika tabel excel saya seperti di bawah ini:

Id    Name     Gender
 1    John     Male
 2    Maria    Female
 3    Daniel   Unknown

Saya ingin datanya disimpan dalam List<ExcelData> di mana

public class ExcelData
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Gender { get; set; }
}

Sehingga saya bisa memanggil isinya menggunakan nama heading. Sebagai contoh, ketika saya melakukan ini:

foreach (var data in ThatList)
{
     Console.WriteLine(data.Id + data.Name + data.Gender);
}

Ini akan memberi saya output ini:

1JohnMale
2MariaFemale
3DanielUnknown

Hanya ini yang saya dapatkan:

var package = new ExcelPackage(new FileInfo(@"C:\ExcelFile.xlsx"));
ExcelWorksheet sheet = package.Workbook.Worksheets[1];

var table = sheet.Tables.First();

table.Columns.Something //I guess I can use this to do what I want

Mohon bantuannya :( Saya telah menghabiskan waktu berjam-jam mencari contoh kode mengenai hal ini sehingga saya dapat belajar darinya tetapi tidak berhasil. Saya juga mengerti ExcelToLinQ berhasil melakukan hal itu tetapi tidak dapat mengenali tabel.

Larutan

Tidak ada yang asli tetapi bagaimana jika Anda menggunakan apa yang saya masukkan ke dalam posting ini:

https://stackoverflow.com/questions/33436525/how-to-parse-excel-rows-back-to-types-using-epplus

Jika Anda ingin mengarahkannya ke tabel saja, maka perlu dimodifikasi. Sesuatu seperti ini harus melakukannya:

public static IEnumerable ConvertTableToObjects(this ExcelTable table) where T : new()
{
    //DateTime Conversion
    var convertDateTime = new Func(excelDate =>
    {
        if (excelDate < 1)
            throw new ArgumentException("Excel dates cannot be smaller than 0.");

        var dateOfReference = new DateTime(1900, 1, 1);

        if (excelDate > 60d)
            excelDate = excelDate - 2;
        else
            excelDate = excelDate - 1;
        return dateOfReference.AddDays(excelDate);
    });

    //Get the properties of T
    var tprops = (new T())
        .GetType()
        .GetProperties()
        .ToList();

    //Get the cells based on the table address
    var start = table.Address.Start;
    var end = table.Address.End;
    var cells = new List();

    //Have to use for loops insteadof worksheet.Cells to protect against empties
    for (var r = start.Row; r  rcell.Value.GetType())
        .ToList();

    //Assume first row has the column names
    var colnames = groups
        .First()
        .Select((hcell, idx) => new { Name = hcell.Value.ToString(), index = idx })
        .Where(o => tprops.Select(p => p.Name).Contains(o.Name))
        .ToList();

    //Everything after the header is data
    var rowvalues = groups
        .Skip(1) //Exclude header
        .Select(cg => cg.Select(c => c.Value).ToList());

    //Create the collection container
    var collection = rowvalues
        .Select(row =>
        {
            var tnew = new T();
            colnames.ForEach(colname =>
            {
                //This is the real wrinkle to using reflection - Excel stores all numbers as double including int
                var val = row[colname.index];
                var type = types[colname.index];
                var prop = tprops.First(p => p.Name == colname.Name);

                //If it is numeric it is a double since that is how excel stores all numbers
                if (type == typeof(double))
                {
                    if (!string.IsNullOrWhiteSpace(val?.ToString()))
                    {
                        //Unbox it
                        var unboxedVal = (double)val;

                        //FAR FROM A COMPLETE LIST!!!
                        if (prop.PropertyType == typeof(Int32))
                            prop.SetValue(tnew, (int)unboxedVal);
                        else if (prop.PropertyType == typeof(double))
                            prop.SetValue(tnew, unboxedVal);
                        else if (prop.PropertyType == typeof(DateTime))
                            prop.SetValue(tnew, convertDateTime(unboxedVal));
                        else
                            throw new NotImplementedException(String.Format("Type '{0}' not implemented yet!", prop.PropertyType.Name));
                    }
                }
                else
                {
                    //Its a string
                    prop.SetValue(tnew, val);
                }
            });

            return tnew;
        });

    //Send it back
    return collection;
}

Berikut ini adalah metode pengujian:

[TestMethod]
public void Table_To_Object_Test()
{
    //Create a test file
    var fi = new FileInfo(@"c:\temp\Table_To_Object.xlsx");

    using (var package = new ExcelPackage(fi))
    {
        var workbook = package.Workbook;
        var worksheet = workbook.Worksheets.First();
        var ThatList = worksheet.Tables.First().ConvertTableToObjects();
        foreach (var data in ThatList)
        {
            Console.WriteLine(data.Id + data.Name + data.Gender);
        }

        package.Save();
    }
}

Memberikan ini di konsol:

1JohnMale
2MariaFemale
3DanielUnknown

Berhati-hatilah jika field Id Anda adalah angka atau string di excel karena kelasnya mengharapkan string.

Komentar (5)

Ini adalah versi kerja saya. Perhatikan bahwa kode resolver tidak ditampilkan tetapi merupakan putaran pada implementasi saya yang memungkinkan kolom diselesaikan meskipun mereka diberi nama sedikit berbeda di setiap lembar kerja.


public static IEnumerable ToArray(this ExcelWorksheet worksheet, List resolvers) where T : new()
{

  // List of all the column names
  var header = worksheet.Cells.GroupBy(cell => cell.Start.Row).First();

  // Get the properties from the type your are populating
  var properties = typeof(T).GetProperties().ToList();

  var start = worksheet.Dimension.Start;
  var end = worksheet.Dimension.End;

  // Resulting list
  var list = new List();

  // Iterate the rows starting at row 2 (ie start.Row + 1)
  for (int row = start.Row + 1; row 
Komentar (1)

Kode di bawah ini akan membaca data excel ke dalam datatable, yang dikonversi menjadi daftar datarows.

if (FileUpload1.HasFile)
{
    if (Path.GetExtension(FileUpload1.FileName) == ".xlsx")
    {
        Stream fs = FileUpload1.FileContent;
        ExcelPackage package = new ExcelPackage(fs);
        DataTable dt = new DataTable();
        dt= package.ToDataTable();
        List listOfRows = new List();
        listOfRows = dt.AsEnumerable().ToList();

    }
}
Komentar (1)