读取Excel文件的最佳方式(.xls / .xlsx)

我知道有不同的方法来读取Excel文件:

  • Iterop
  • Oledb
  • Open Xml SDK

兼容性不是问题,因为程序将在受控环境中执行。

我的要求:
读取一个文件到一个DataTable / CUstom Entitie s(我不知道如何使一个对象的dynamic属性/字段[列名将在var文件中变化])

使用DataTable/Custom Entities使用其数据执行一些操作。

用操作结果更新DataTable

把它写回excel file

这会更简单。

另外如果可能的话,build议我在自定义实体(dynamic添加属性/字段到对象)

看看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<string>(), Supplier = row["Supplier"].Cast<string>(), Ref = row["Ref"].Cast<string>(), } where item.Supplier == "Walmart" select item; 

它也允许强types的行访问。

使用OLE查询,它非常简单(例如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;"); 

您也可以在CodePlex上使用Excel Data Reader作为开源项目。 它的工作真的很好导出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(); 

参考: 如何使用Microsoft.Office.Interop.Excel从Excel导入到DataSet?

尝试使用这个免费的方式, 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