【问题标题】:EPPlus: ListDataValidation slows Package.SaveEPPlus:ListDataValidation 减慢 Package.Save
【发布时间】:2018-03-02 09:13:32
【问题描述】:

我使用 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;
}

我们在测试期间发现了一个严重的性能问题 - 调用 ExcelPackage.Save() 需要 3 秒以上的时间来处理 50 行工作表,而调用 100 行工作表需要超过 10 秒。我开始研究源代码并注意到 EPPlus 在Save() 调用上执行数据验证。当我删除对AddListDataValidation 的调用和随后的 2 行时,我得到了巨大的性能提升:100 行耗时不到 0.09 秒。 所以,问题是: 有没有办法在没有 ExcelDataValidationList 的情况下创建下拉列表? 有没有办法创建自定义验证器并覆盖验证逻辑(根本不对列表进行任何验证)以加快电子表格的保存速度? 有没有办法在保存时禁用电子表格验证?

【问题讨论】:

    标签: c# epplus epplus-4


    【解决方案1】:

    事实证明,是的。我很难理解 ExcelDataValidationCustom 如何用于进行各种数据验证,然后研究了子类化和覆盖 Validate()。无济于事。

    在通过代码的过程中,我偶然发现了ExcelDataValidationCollection.InternalValidationEnabled。不过,对于工作表来说,这似乎是全有或全无。

    ExcelPackage pkg = ...;
    ExcelWorksheet ws = pkg.Worksheets.Add("sheet");
    ws.DataValidations.InternalValidationEnabled = false;
    

    我的(宽)~2000 行工作表需要将近 15 分钟,现在

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2014-04-06
      • 2011-10-13
      • 1970-01-01
      • 2022-06-10
      • 2018-05-22
      相关资源
      最近更新 更多