【问题标题】:Efficient way to write excel from C#从 C# 编写 excel 的有效方法
【发布时间】:2011-11-10 06:11:46
【问题描述】:

我正在尝试使用 c# 生成 excel 以下是它的代码 sn-p

Microsoft.Office.Interop.Excel;
.
.
.
foreach (string[] rowContents in lstOutputFileContent)
{
    for(int i = 0; i < rowContents.Length; i++)
    {
        sheet.Cells[currRow, i + 1] = rowContents[i];
    }
}

但问题是当 lstOutputFileContent 包含超过 50K 行时,写入时间太长(4-5 分钟)。在这种情况下是否有更好/更快的方法来编写 excel,即我有字符串数组列表,我想将其写入 excel。

我尝试使用 OleDb,但如果前几行包含的单元格较少,那么当我尝试插入带有额外单元格的行时,就会出错。

任何帮助将不胜感激。

【问题讨论】:

标签: c# performance excel


【解决方案1】:

如果您使用 Excel 2007 或更高版本,最好的选择是Open XML SDK 2.0

您还可以修改当前方法。不要单独写入每个值,而是创建一个二维数组来保存所有值。然后得到一个相同大小的范围,并将该范围的值设置为二维数组。这样一来,您只需承担一个编组 COM 调用的成本,而不是您正在处理的很多很多。

【讨论】:

  • 确实,使用带 Range 的二维数组是最快的解决方案。
  • 但是当您使用范围插入时,数字也会作为字符串插入到 excel 中,这会改变输出文件的预期行为
  • aashutoshsingh:这并不完全正确。如果您创建一个 object 数组,然后将字符串或数字放入其中,电子表格将键入单元格以匹配对象的类型。
【解决方案2】:

您可以使用我在Excel C# inputting into specific cell 的答案中的代码一次插入一行而不是一个单元格

当我遇到我认为与您类似的性能问题时,我意识到了这一点。

【讨论】:

  • +1,这会将 Excel 的往返次数从 (RowCount * RowSize) 减少到 (RowCount),这是一个显着的改进。但是如果 RowCount > 50K,你仍然有很多往返。您可以更进一步,一次调用即可将二维数组插入到 Range 中。
【解决方案3】:

对于 Excel 2002 (?) 或更高版本,您可以使用简单的表格以 HTML 格式提供电子表格内容:请参阅 here 以获取简单示例。这将是最快选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多