.Net Excel Interop 多列删除,范围非常慢

问题描述 投票:0回答:1

我正在使用下面的代码通过 Excel Interop 库删除具有范围的多列。删除整个列需要很长时间。是否有其他替代方法可以快速删除多列。

Excel.Application _excel = Globals.ThisAddIn.Application;
Excel.Workbook sourceWorkbook = _excel.ActiveWorkbook;
_excel.Application.ScreenUpdating = false;
_wb = _excel.Workbooks.Add(Type.Missing);
_wb.Activate();
_wb.Windows[1].Visible = true;
_wb.Application.ScreenUpdating = false;
_wb.Application.DisplayAlerts = false;
for (int i = 1; i <= sourceWorkbook.Sheets.Count; i++)
{
   sourceWorkbook.Sheets[i].Activate();
   sourceWorkbook.Sheets[i].Copy(Type.Missing, _wb.Sheets[_wb.Sheets.Count]);
   _wb.Activate();
   _wb.Sheets[_wb.Sheets.Count].Activate();
   if (_wb.Sheets[_wb.Sheets.Count].ProtectContents)
   {
      _wb.Sheets[_wb.Sheets.Count].Unprotect(AppConstants.Password);
   }
   _wb.Sheets[_wb.Sheets.Count].Columns["IP:XFD"].EntireColumn.Delete(); <-- Here the delete process is taking time
   if (!_wb.Sheets[_wb.Sheets.Count].ProtectContents)
   {
     _wb.Sheets[_wb.Sheets.Count].Protect(AppConstants.Password);
   }
}
c# excel vsto excel-interop excel-addins
1个回答
1
投票

好吧,既然你特别想知道如何快速做到这一点,我想你有三个选择:

  1. 优化您现有的代码。一些可能性:
  • 简化删除调用:
_wb.Sheets[_wb.Sheets.Count].Columns["IP:XFD"].EntireColumn.Delete();

由于您的 Columns[] 参数是 already 全高列...我认为额外的 .EntireColumn 取消引用是多余的。对于数据的大小来说,这肯定会产生一些开销。我认为这应该具有相同的功能:

_wb.Sheets[_wb.Sheets.Count].Columns["IP:XFD"].Delete();
  • @user246821 是完全正确的 - 释放你的内存,特别是如果这是一个你要在多个文件和/或多次运行而无需重新启动插件的函数。

  • 考虑到对 _wb.Sheets 和 _wb.Sheets.Count 的每次调用都在循环内......并且这些不一定是“免费的”。如果可能,将值存储在临时变量中,然后调用这些临时变量,而不是取消引用 _wb 及其组件。比我更多地使用 Interop 的人将不得不进一步评论如何存储这些和/或是否值得。

  • 尝试在循环内以工作表大小的位复制工作簿。通过文件系统复制显然会更快。您可以从手动创建完整文件的副本开始吗?或者您可以在循环外执行单个完整的工作簿或文件复制操作吗?这些将消除在活动对象之间来回翻转,并且您可以避免在内存中携带两个工作簿。作为奖励,如果您复制完整的文件...也许您可以想出一种批量保护/取消保护的方法?

  1. 探索使用 PowerQuery 准备或管理数据。这可能更快且可重复。然而,这可能无法与您正在做的其他事情集成,而且它的便携性也不是很好……但它是一个有效的选择。

  2. 考虑其他库、语言和/或转换格式。我认为速度的最佳情况是,如果您的数据都是纯文本,没有格式化,那么您的流程:

  • 将 XLS 文件拆分为单独的 CSV 文件
  • 截断行。我认为您有大约 260 列要保留(数百行?数千?)和 53 个文件...,并且您了解 C#,所以我猜您可以在 C/C++ 中更快地完成此操作。
  • 如果您确实需要它,请将 CSV 文件重新组合成单个 XLS 文件

这些是我想到的主要途径。除非你绝望并考虑硬件升级!

© www.soinside.com 2019 - 2024. All rights reserved.