【问题标题】:Fast Way to Update part of Excel worksheet from C# Interop Add In从 C# Interop Add In 更新部分 Excel 工作表的快速方法
【发布时间】:2016-06-18 06:03:37
【问题描述】:

我正在尝试找到一种快速更新 Excel 电子表格(C# 互操作)的方法。这是一个 Excel 插件,完全填充后工作表将有大约 20000 行。我目前的流程如下:

  • 我订阅了事件服务
  • 当我收到第一个事件时,我会处理一个世界状态,我会在其中填充一个数组并快速填充电子表格。这需要几秒钟才能完成,但性能很好。同时,我用一个键和一个包含 Excel 地址和单元格值的类填充字典。
  • 我收到的后续事件应被视为更新/插入。这意味着我需要遍历我的字典并查看发生了什么变化(这已经足够快了)。慢的部分是下面的代码,我在循环中获取 Excel 范围并更新更改的值:

    Globals.MyAddIn.Application.ScreenUpdating = false;
    XL.Range add1 = activeWorksheet.get_Range(xlDataPoint.ExcelAddress);
    xlDataPoint.Value = value.ToString();
    add1.Value2 = value;
    Globals.MyAddIn.Application.ScreenUpdating = true;
    
  • 由于某些单元格发生变化而其他单元格没有变化 - 我只想更新那些值已更改的单元格。我还需要让工作表响应用户。 如何加快电子表格的更新速度(我怀疑 VBA 或 C# 中的答案是一样的。)?

【问题讨论】:

  • 尝试将 screenupdating 调用移到循环之外? (假设从您发布的代码中它们是每个单元格的调用)
  • 蒂姆,差别不大,但我可以分配更大的范围,这有帮助

标签: c# excel vba excel-interop excel-addins


【解决方案1】:

我可以看到三种提高速度的方法。首先 - 听从 Tim Williams 的建议,将 ScreenUpdating 调用移到循环之外。其次 - 如果您的单元格是序列,请使用Range.Value 属性一次为所有单元格赋值:

object[,] example = new object[2,2] { {1, 2}, { 3, 4}};
activeWorksheet.Range[activeWorksheet.Cells[1,1], activeWorksheet.Cells[2,2]].Value = example;

另一种方法,如果许多单元格中的值相同,则使用 Application.Union 函数将多个单元格作为一个范围并一次分配值。

【讨论】:

  • 是的,正如您所指出的,我可以分配给一系列单元格。 ScreenUpdating 并没有产生重大影响。
猜你喜欢
  • 2021-03-09
  • 2019-01-14
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多