【发布时间】:2013-05-22 13:14:00
【问题描述】:
我有一个关于在 C# 中加载 Excel (Xlsx) 文件的问题。我已经使用 NPOI 2.0 实现了 Excel 加载,但性能非常糟糕(15 到 25 秒的加载时间,10000 行和 60 列(在 Win7 上运行 Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz(4 CPU),~2.5GHz))。我认为这是因为 NPOI 2.0 仍处于测试阶段,所以我尝试了另一个名为 EPPlus 的库,它仍然需要大约相同的时间来加载 Excel 文件。
这是我使用 EPPlus 加载它的方式:
var existingFile = new FileInfo(path);
var excelData = new ExcelViewModel(path);
// Open and read the XlSX file.
using (var package = new ExcelPackage(existingFile))
{
// Get the work book in the file
ExcelWorkbook workBook = package.Workbook;
if (workBook != null)
{
// Here is some initializing......
var viewSheetModel = new ExcelSheetViewModel(sheet.Name, numberOfColumns, titles);
for (var row = titleRowIndex + 1; row <= end.Row; ++row)
{
var viewRowModel = new ExcelRowViewModel();
for (int column = start.Column; column <= end.Column; ++column)
{
var cell = sheet.Cells[row, column];
viewRowModel.AddCellValue(cell.Value != null ? cell.Value.ToString() : string.Empty);
}
viewSheetModel.Rows.Add(viewRowModel);
}
excelData.AddSheet(viewSheetModel);
}
}
根据 dotTrace Profiler,大约 40% 的时间浪费在 get_Workbook 方法(通过访问“package.Workbook”属性调用)中,然后在 get_Item 和 get_Value 调用中浪费了另外 30%,然后在调用中浪费了 5% AddCellValue 方法(这是我的数据模型),其余时间分散到各种方法调用中。
是我做错了什么,还是这种表现正常?
干杯
【问题讨论】:
-
我无法谈论上述性能,但您可以考虑查看像 SpreadsheetGear 这样的产品,它可以轻松处理这种文件大小。我不知道您的工作簿包含什么样的数据,但是在我的 Intel i7-3770K @ 3.50GHz 上加载一个包含 10K 行和 60 列随机文本/数字数据的工作簿并读取每个单元格值花费了 SpreadsheetGear ~1 秒。顺便说一句,我让 SpreadsheetGear 在大约相同的时间内生成这些测试工作簿。如果您愿意,我可以提供更多详细信息。免责声明:我为 SpreadsheetGear 工作。
-
您使用的是哪个版本的 EPPlus?我尝试使用 EPPlus 3.1.3,它的加载速度足够快。没有实际的 Excel 文件,很难说更多。也许 Excel 文件有其他类型的“隐藏”数据(隐藏的行/列/图片、多个数据密集型工作表)?
标签: c# performance excel epplus npoi