EXCEL互操作-效率和性能

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我想知道我能做些什么来提高Excel自动化的性能,因为如果工作表中有很多事情发生,它可能会很慢。

以下是我发现自己的一些:

  • ExcelApp.ScreenUpdating = false-关闭屏幕的重绘
  • ExcelApp.Calculation = Excel.XlCalculation.xlCalculationManual-关闭计算引擎,以便Excel不会在单元格值更改时自动重新计算(完成后再打开)
  • 减少Worksheet.Cells.Item(row, col)Worksheet.Range--实现一些单元位置的缓存,使执行时间从~40秒缩短到~5秒。

什么样的互操作调用会严重影响性能,应该避免?还能做些什么来避免不必要的处理?

提问于
用户回答回答于

对于任何想知道如何从db结果集中填充Excel工作表的人来说,这是最好的方法。这并不意味着是一个完整的列表,但它确实列出了几个选项。

一些性能数字,当试图填充一个包含155个列和4200条记录在一个旧的奔腾4 3 GHz盒上的Excel表时,包括数据检索时间从不超过10秒到最慢到最快的顺序如下...

  1. 一次一个-不到11分钟
  2. 将数据集转换为html+Savinghtml到磁盘+将html加载到excel并将工作表保存为xls/xlsx-5分钟
  3. 一次一列-4分钟
  4. 使用已弃用的sp_在sql 2005中创建一个html文件的makewebTask过程--9秒+,然后在excel中加载html文件,并将其保存为xls/xlsx-大约2分钟。
  5. 将.NET数据集转换为ADO RecordSet,并使用WorkSheet.Range[].CopyFromRecordset函数填充excel-45秒!

最后我使用了选项5。希望这能帮上忙。

用户回答回答于

当使用C#或VB.Net获取或设置范围时,确定范围的总大小,然后得到一个大的二维对象数组...

//get values
object[,] objectArray = shtName.get_Range("A1:Z100").Value2;
iFace = Convert.ToInt32(objectArray[1,1]);

//set values
object[,] objectArray = new object[3,1] {{"A"}{"B"}{"C"}};
rngName.Value2 = objectArray;

请注意Excel存储什么数据类型(文本或数字)很重要,因为当从对象数组中将类型转换回时,Excel不会自动完成此操作。如果需要的话,添加测试来验证数据,如果事先无法确定数据的类型。

扫码关注云+社区