读取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