Оптимальный способ чтения файла Excel (.xls / .xlsx)

Я знаю, что есть разные способы чтения файла Excel:

  • Iterop
  • Oledb
  • Open Xml SDK

Совместимость не является вопросом, потому что программа будет выполнена в контролируемой среде.

Мои требования:
Прочитайте файл в DataTable / CUstom Entitie s (я не знаю, как создавать динамические свойства / поля для объекта [имена столбцов будут изменяться в файле Excel])

Используйте DataTable/Custom Entities для выполнения некоторых операций с использованием своих данных.

Обновление DataTable с результатами операций

Запишите его обратно в excel file .

Что было бы проще.

Также, если это возможно, посоветуйте мне на пользовательских объектах (динамически добавляя свойства / поля к объекту)

Посмотрите на Linq-to-Excel . Это довольно аккуратно.

 var book = new LinqToExcel.ExcelQueryFactory(@"File.xlsx"); var query = from row in book.Worksheet("Stock Entry") let item = new { Code = row["Code"].Cast(), Supplier = row["Supplier"].Cast(), Ref = row["Ref"].Cast(), } where item.Supplier == "Walmart" select item; 

Это также позволяет использовать строго типизированный доступ к строкам.

Используя OLE Query, это довольно просто (например, sheetName – Sheet1 $):

 DataTable LoadWorksheetInDataTable(string fileName, string sheetName) { DataTable sheetData = new DataTable(); using (OleDbConnection conn = this.returnConnection(fileName)) { conn.Open(); // retrieve the data using data adapter OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); sheetAdapter.Fill(sheetData); } return sheetData; } private OleDbConnection returnConnection(string fileName) { return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\""); } 

Для новых версий Excel:

 return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=Excel 12.0;"); 

Вы также можете использовать Excel Data Reader проект с открытым исходным кодом на CodePlex. Он отлично работает, чтобы экспортировать данные из листов Excel.

Код примера, указанный в указанной ссылке:

 FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read); //1. Reading from a binary Excel file ('97-2003 format; *.xls) IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); //... //2. Reading from a OpenXml Excel file (2007 format; *.xlsx) IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); //... //3. DataSet - The result of each spreadsheet will be created in the result.Tables DataSet result = excelReader.AsDataSet(); //... //4. DataSet - Create column names from first row excelReader.IsFirstRowAsColumnNames = true; DataSet result = excelReader.AsDataSet(); //5. Data Reader methods while (excelReader.Read()) { //excelReader.GetInt32(0); } //6. Free resources (IExcelDataReader is IDisposable) excelReader.Close(); 

Справка: Как импортировать из Excel в DataSet с помощью Microsoft.Office.Interop.Excel?

Попытайтесь использовать этот бесплатный способ для этого, https://freenetexcel.codeplex.com

  Workbook workbook = new Workbook(); workbook.LoadFromFile(@"..\..\parts.xls",ExcelVersion.Version97to2003); //Initialize worksheet Worksheet sheet = workbook.Worksheets[0]; DataTable dataTable = sheet.ExportDataTable(); 

Если вы можете ограничить его только (формат Open Office XML) * .xlsx, то, вероятно, самой популярной библиотекой будет EPPLus .

Бонус – нет других зависимостей. Просто установите с помощью nuget:

 Install-Package EPPlus 
Interesting Posts

Как реализовать представление аккордеона для iPhone SDK-приложения?

Выключить совпадение скобок в высоком тексте 2

Как выполнить команду при каждом изменении файла?

Как показать скрытые папки в Windows 8 из современного пользовательского интерфейса?

Microsoft Word внезапно не сохранит файлы; «Слово не может создать рабочий файл – проверьте переменную среды temp»

NSString для NSDate

Сохранить почту в msg-файле с помощью EWS API

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

Рассчитать расстояние между двумя точками долготы широты? (Формула Хаверсина)

Статический метод в общем classе?

Блокировать всплывающее окно Bypass на window.open, когда установлен JQuery event.preventDefault ()

Windows XP зависает при завершении работы в VMWare Fusion

сервер tomcat не запускает сервер и приложение в STS

Поля текстовых процессоров в зависимости от области печати

Сложенная гистограмма

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