我需要从 .Net 访问 Excel 工作簿。我知道所有不同的方法(我已经在博客文章中写了它们),而且我知道使用原生 .Net 组件将是最快的。但问题是,哪个组件获胜?有人对它们进行基准测试吗?我一直在使用 Syncfusion XlsIO,但是对于某些关键操作(例如删除包含数千个命名范围的工作簿中的行)来说,这非常慢。
3 回答
我没有做任何适当的基准测试,但我尝试了其他几个组件,发现SpreadsheetGear比我之前使用的 XlsIO 快得多。我在这篇文章中写下了我的一些发现
无法帮助您解决原始问题,但您是否知道您可以使用 OleDbConnection 访问 Excel 文件,因此将其视为数据库?然后,您可以将工作表读入 DataTable,对应用程序中的数据执行所需的所有更改,然后使用 OleDbConnection 将其全部保存回文件中。
是的,但出于对 Syncfusion 的礼貌,我不会同时发布它们(他们要求您不要发布基准测试),因为我不是经验丰富的测试人员,所以我的测试可能有些缺陷,但主要是因为您的实际基准测试结果谁赢和赢多少有很大的不同。
我采用了他们的一个“性能”示例,并在 EPPlus 中添加了相同的例程来比较它们。XLSIO 仅使用简单的插入就快了 15% 左右,具体取决于行/列比率(我尝试了一些),内存使用情况似乎非常相似。当我添加一个例程时,在添加所有行之后,每 10 行删除一次,然后从该行向上插入 2 行的新行 - 在这种情况下,XLSIO 的速度要慢得多。
通用基准对您几乎没有用处。您需要在您使用的特定场景中相互尝试。
我已经使用 EPPlus 几年了,性能一直很好,我不记得曾对它大喊大叫。
更值得您考虑的是功能、支持(根据我的经验,Syncfusion 一直很好)、文档、对源代码的访问(如果这很重要)以及 - 重要的是 - API 对您有多大意义,语法可以是很不一样。例如。命名样式
XLSIO
headerStyle.BeginUpdate();
workbook.SetPaletteColor(8, System.Drawing.Color.FromArgb(255, 174, 33));
headerStyle.Color = System.Drawing.Color.FromArgb(255, 174, 33);
headerStyle.Font.Bold = true;
headerStyle.Borders[ExcelBordersIndex.EdgeLeft] .LineStyle = ExcelLineStyle.Thin;
headerStyle.Borders[ExcelBordersIndex.EdgeRight] .LineStyle = ExcelLineStyle.Thin;
headerStyle.Borders[ExcelBordersIndex.EdgeTop] .LineStyle = ExcelLineStyle.Thin;
headerStyle.Borders[ExcelBordersIndex.EdgeBottom].LineStyle = ExcelLineStyle.Thin;
headerStyle.EndUpdate();
EPPlus
ExcelNamedStyleXml headerStyle = xlPackage.Workbook.Styles.CreateNamedStyle("HeaderStyle");
headerStyle.Style.Fill.PatternType = ExcelFillStyle.Solid; // <== needed or BackgroundColor throws an exception
headerStyle.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.FromArgb(255, 174, 33));
headerStyle.Style.Font.Bold = true;
headerStyle.Style.Border.Left.Style = ExcelBorderStyle.Thin;
headerStyle.Style.Border.Right.Style = ExcelBorderStyle.Thin;
headerStyle.Style.Border.Top.Style = ExcelBorderStyle.Thin;
headerStyle.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;