我使用 EPPlus 生成一个包含大量下拉列表的电子表格。下拉列表使用以下代码生成:
private void SetDropDown(string destColumn, int row, string selectedValue,
IEnumerable<string> options)
{
int colNum = GetColumnNumByLetter(destColumn);
var dropDown = _sheet.Cells[row,colNum].DataValidation.AddListDataValidation();
dropDown.ShowErrorMessage = false;
options.ForEach(x=>dropDown.Formula.Values.Add(x));
_sheet.Cells[row, colNum].Value = selectedValue;
}
我们在测试期间注意到一个严重的性能问题 - 50 行工作表调用 ExcelPackage.Save()
花费了 3 秒以上,100 行工作表花费了 10 多秒。我开始调查源代码,并注意到 EPPlus 在调用Save()
执行数据验证。当我删除对 AddListDataValidation
和 2 条后续线路的调用时,我得到了巨大的性能改进:100 行花费不到 0.09 秒的时间。所以,问题是:有没有办法创建一个没有ExcelDataValidationList的下拉列表?有没有办法创建自定义验证器并覆盖验证逻辑(根本不对列表进行任何验证(以加快电子表格保存?有没有办法在保存时禁用电子表格验证?
事实证明,是的,有。 我努力理解如何使用ExcelDataValidationCustom
来进行各种数据验证,然后研究了子类化和覆盖Validate()
。 无济于事。
在我浏览代码的路上,我偶然发现了ExcelDataValidationCollection.InternalValidationEnabled
. 不过,对于工作表来说,这似乎是全有或全无的。
ExcelPackage pkg = ...;
ExcelWorksheet ws = pkg.Worksheets.Add("sheet");
ws.DataValidations.InternalValidationEnabled = false;
我的(宽(~2000 行工作表花了将近 15 分钟,现在<10 秒。