首页 > 解决方案 > 将文本放在所有 Excel 工作表的标题中(循环:foreach、for) - 低性能(C#)

问题描述

我想将文本插入到 Excel 中每个工作表的标题中。不幸的是,这需要很长时间。我尝试了两个循环:foreach 和 for。下面是我与秒表一起使用的简单代码。看起来 Excel 需要大约 0.7 秒来处理一张纸。即使循环中有一张纸,也需要 0.5 秒。打开的床单越多,每个人的循环时间就越长。当然,一张纸的情况只是为了描绘这种情况。10 张纸需要 7.5 秒,每次用户保存工作簿时我都需要这样做。启用自动保存选项后,这可能具有挑战性。

我相信还有另一种可能性,但我找不到任何解决方案。我读到了编组,但是 7,5 秒?也许有诸如快速内置多次插入之类的东西,比如 AllSheets.PageSetup.LeftHeader?

你能分享你在这个话题上的经验吗?

//aWb is an Active WorkBook

Stopwatch sw = new Stopwatch();
sw.Start();

foreach (Excel.Worksheet ew in aWb.Worksheets) //7:541 for 10 sheets
{
    ew.PageSetup.LeftHeader = "LeftHeader";
}
sw.Stop();
MessageBox.Show("Foreach: " + sw.Elapsed.Seconds + ":" + sw.Elapsed.Milliseconds);

sw.Reset();
sw.Start();

for (int x = 1; x <= Application.Sheets.Count; x++) //7:318 for 10 sheets
{
    aWb.Sheets[x].PageSetup.LeftHeader = "LeftHeader";
}
sw.Stop();
MessageBox.Show("For: " + sw.Elapsed.Seconds + ":" + sw.Elapsed.Milliseconds);

标签: c#excelvstoexcel-interop

解决方案


首先,我建议关闭以下属性以提高整体性能:

  • Application.ScreenUpdating - 关闭屏幕更新以加快您的宏代码。您将无法看到宏在做什么,但它会运行得更快。请记住在宏结束时将 ScreenUpdating 属性设置回 True。
  • Worksheet.EnableCalculation - 如果 Microsoft Excel 在必要时自动重新计算工作表,则为真。如果 Excel 不重新计算工作表,则为 False。当此属性的值为 False 时,您不能请求重新计算。当您将值从 False 更改为 True 时,Excel 会重新计算工作表。
  • Application.Calculation - 返回或设置表示计算模式的 XlCalculation 值。

另外,我建议使用Open XML SDK,有时在没有 Excel 自动化的情况下完成工作要快得多。


推荐阅读