EPPlus – прочитать таблицу Excel

Используя EPPlus, я хочу прочитать таблицу excel, а затем сохранить все содержимое из каждого столбца в соответствующий List . Я хочу, чтобы он распознавал заголовок таблицы и классифицировал содержимое на основе этого.

Например, если моя таблица excel выглядит так:

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

Я хочу, чтобы данные List<ExcelData> в List<ExcelData> где

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

Чтобы я мог вызывать содержимое, используя название заголовка. Например, когда я это делаю:

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

Это даст мне этот результат:

 1JohnMale 2MariaFemale 3DanielUnknown 

Это действительно все, что я получил:

 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 

Пожалуйста, помогите: (Я потратил много времени на поиск образца кода в отношении этого, чтобы я мог учиться на нем, но безрезультатно. Я также понимаю, что ExcelToLinQ удалось это сделать, но он не может распознать таблицу.

    Нет никакого родного, но что, если вы используете то, что я положил в этот пост:

    Как анализировать строки excel для типов с использованием EPPlus

    Если вы хотите указать его на таблицу, это нужно будет изменить. Что-то вроде этого должно это сделать:

     public static IEnumerable<T> ConvertTableToObjects<T>(this ExcelTable table) where T : new() { //DateTime Conversion var convertDateTime = new Func<double, DateTime>(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 groups = table.WorkSheet.Cells[table.Address.Start.Row, table.Address.Start.Column, table.Address.End.Row, table.Address.End.Column] .GroupBy(cell => cell.Start.Row) .ToList(); //Assume the second row represents column data types (big assumption!) var types = groups .Skip(1) .First() .Select(rcell => 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)) { //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; } 

    Вот тестовый метод:

     [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<ExcelData>(); foreach (var data in ThatList) { Console.WriteLine(data.Id + data.Name + data.Gender); } package.Save(); } } 

    Дайте это в консоли:

     1JohnMale 2MariaFemale 3DanielUnknown 

    Просто будьте осторожны, если поле Id является числом или строкой в ​​excel, поскольку класс ожидает строку.

    Ниже код будет читать данные excel в datatable, который преобразуется в список 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<DataRow> listOfRows = new List<DataRow>(); listOfRows = dt.AsEnumerable().ToList(); } } 
    Interesting Posts

    Связать макрос, чтобы выделить ячейку onclick?

    Расчет со значениями, выраженными в разных единицах (KB, MB, GB)

    vb.net & office: Невозможно запустить COM-объект типа «Microsoft.Office.Interop.Excel.ApplicationClass»

    Проверка даты / Open Workbook VBA

    Excel разрушает мои номера с ведущими нулями

    excel formula поможет разбить сложные имена

    Перенос определенных столбцов (почти 250) из одной книги Excel в другую

    Веб-страница для отображения таблицы с функцией автоматического обновления

    Как настроить радиокнопки в Excel?

    VBA Copy Вставить между книгами одинаковые листы, Открыть через диалоговое окно

    Пользовательская функция возвращает #REF в рабочем листе, работает в VBA

    После загрузки файла excel с использованием php он дает ошибку

    Как переопределить заголовок для имени поля?

    Как создать статическую ссылку на ячейку в Excel?

    Прокрутите все вложенные папки и файлы в папке и напишите последнюю измененную информацию о дате в электронную таблицу Excel

    Давайте будем гением компьютера.