c#wpf导入excel性能

我正在导入一个可以长度不同的大型excel文件(250列+10万行),它包含数据列,列的数量和名称可以更改,行也是可变的,但它们是值。

我正在使用Interop将数据拉入绑定到数据网格的数据表中,但是我正在单独导入每行,并且可能需要25分钟才能完成更大的文件。

public Task<DataTable> ParseExcel(string filePath) { return Task.Run(() => { var excelApp = new Microsoft.Office.Interop.Excel.Application(); var excelBook = excelApp.Workbooks.Open(filePath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); var excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelBook.Worksheets.Item[1]; Microsoft.Office.Interop.Excel.Range excelRange = excelSheet.UsedRange; DataTable sessiondt = new DataTable(); object[,] value = excelRange.Value; int columnsCount = value.GetLength(1); for (var colCnt = 1; colCnt <= columnsCount; colCnt++) { sessiondt.Columns.Add((string)value[1, colCnt], typeof(string)); } int rowsCount = value.GetLength(0); for (var rowCnt = 2; rowCnt <= rowsCount; rowCnt++) { var dataRow = sessiondt.NewRow(); for (var colCnt = 1; colCnt <= columnsCount; colCnt++) { dataRow[colCnt - 1] = value[rowCnt, colCnt]; } sessiondt.Rows.Add(dataRow); } excelBook.Close(true); excelApp.Quit(); return sessiondt; }); } 

而不是单独插入每一行,它可能会更快地把它们放到一个可以被数据绑定的自定义对象列表中。 但我不确定如何做到这一点。

此外,我想以一种方式绑定列,我不必事先在列名中编写代码。 我将试图在图表中显示这些内容,并且能够将列名自动填充到combobox中将会更容易。

预先感谢您,我是新来的C#和WPF,仍然在学习。

Interop有一些特定的用途,但是如果您只是想从Excel文件中获取数据,Interop可能是最慢和最麻烦的方法。

Excel文件(.xls或.xlsx)可以像数据库一样处理和访问。

只要在工作表中有行和列的数据,就可以打开它的OleDb连接并对其运行查询。

图纸名称代替表格名称,如果在图纸的第一行中有列标题,那么这些是字段名称。

你只需要正确的连接string: https : //www.connectionstrings.com/excel/

这种检索数据的方法之一就是根据每列中的前几项自动分配数据types。 你不能覆盖这个行为(你曾经能够,但不能再)。 这可能会导致问题的时间是如果你有一个列中的字母数字,并且前十几个条目都是数字。 然后该列将被自动分配为数字types。 如果此列的后面几行中的数据是混合字母数字或直接文本,则这些条目将被忽略(不导入),因为它们与最初分配的数据types不匹配。

唯一的好办法是以编程方式解压缩和parsingXML文件的内容。

如果你始终有一致的数据,那么这不是问题。

这里有另外一种方式,通过使用GemBox.Spreadsheet库,你可以做到这一点,快速,简单:

 public Task<DataTable> ParseExcel(string filePath) { return Task.Run(() => { ExcelFile excelBook = ExcelFile.Load(filePath); ExcelWorksheet excelSheet = excelBook.Worksheets[0]; CreateDataTableOptions options = new CreateDataTableOptions(); return excelSheet.CreateDataTable(options); }); } 

从Sheet示例中检查这个DataTable 。