gpt4 book ai didi

C# 加载 xlsx 文件性能不好

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:52 26 4
gpt4 key购买 nike

我有一个关于在 C# 中加载 Excel (Xlsx) 文件的问题。我已经使用 NPOI 2.0 实现了 Excel 加载,但性能非常糟糕(10000 行和 60 列的加载时间为 15 到 25 秒(在 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”属性调用)中,然后是另外 30% 的时间浪费在 get_Item 和 get_Value 调用中,然后是 5%方法 AddCellValue(这是我的数据模型),其余时间分散到各种方法调用中。

是我做错了什么,还是这种表现正常?

干杯

最佳答案

我发现 FOR 循环非常昂贵。以下是我如何在 1 秒多一点的时间内加载一张 85000 x 26 的纸张。

ExcelWorksheet ws = ...

Int32 maxLength = ws.Dimension.End.Row + 1;
Int32 maxWidth = ws.Dimension.End.Column + 1;

// Fetch the entire sheet as one huge range
ExcelRange cells = ws.Cells[1, 1, maxLength, maxWidth];

// cells.Values now contains a 2 dimensional object array
// Feel free to stop here

// I wanted a jagged array of type string, so I converted it.
// Start by converting the 2D array to 1D.
object[] obj_values = ((object[,]) cells.Value).Cast<object>().ToArray();

// Convert object[] to string[]
string[] str_values = Array.ConvertAll(obj_values, p => p == null ? "" : p.ToString());

// Chunk 1D array back into a jagged array and convert nulls to String.Empty
Int32 j = 0;
string[][] values = str_values.GroupBy(p => j++ / maxWidth).Select(q => q.ToArray()).ToArray();

// This was very fast compared to FOR loops!

关于C# 加载 xlsx 文件性能不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16692763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com