gpt4 book ai didi

c# - 与 VBA 相比,VSTO 性能较慢

转载 作者:行者123 更新时间:2023-12-04 19:51:45 24 4
gpt4 key购买 nike

我是 stackoverflow 的新手,因此我将直接从我的问题开始。

我有几年通过集成 VBA 为 Excel 开发宏的经验,半年前我开始学习新语言 C#。我喜欢它,它的可能性,我还找到了通过 Visual Studio(需要 VSTO)直接在 C# 中开发 Office 插件的选项。我遇到的问题是,在进行多次测试后,我尝试比较使用 C# 创建的插件和使用 VBA 创建的宏的速度(例如,将字符串“Test String”分别粘贴到从 A1 到 A10 000 的每个单元格)。问题是集成的 VBA 比提到的使用 Visual Studio (C#) 创建的插件快数倍。当时我决定不理会这个问题,但后来我遇到了同样的问题,但这次不是 cca 10 秒 (VBA) 过程,而是花费了 2 多分钟!

在对谷歌进行研究后,我发现 VSTO 在性能方面并不好,尤其是当您需要您的应用程序与 Excel 交互时(因此有一些方法可以解决该问题,例如将数据保存到动态数组中,然后直接将整个数组填充到事件表中);然而,在某些情况下,您只需要与 excel 交互(就像我不得不动态取消保护工作簿中的许多工作表......而在这里您只需说 ActiveSheet.Unprotect)

我想问你们的问题是,除了速度较慢的 VSTO 之外,还有什么方法可以为 Excel/Word/其他易于部署的 Office 产品创建(可能是其他软件)插件吗?非常感谢。

问候,罗伯特

最佳答案

单独填充 10000 个单元格会让您认为 VSTO 非常慢。使用您提到的动态数组方法,我可以在很短的时间内完成:

static public void PopulateABigNumberOfCells(Excel.Application xlApp, DataTable dataTable)
{
//Turn off Excel updating
SwitchApplicationSettings(xlApp,false);

//Populate a 2D array - via a DataTable in this example
object[,] values = (object[,])Array.CreateInstance(typeof(object), new int[2] { dataTable.Rows.Count, dataTable.Columns.Count }, new int[2] { 1, 1 });
for (int i = 0; i < dataTablea.Rows.Count; i++)
{
for (int j = 0; j < dataTable.Columns.Count; j++)
{
values[i + 1, j + 1] = dataTable.Rows[i][j] == DBNull.Value ? 0 : dataTable.Rows[i][j];
}
}

//Populate all cells in one swoop
leftCellNum = XlHelper.ColumnNameToNumber(leftColumn);
string rightBottom = XlHelper.ColumnNumberToName(leftCellNum + dataTable.Columns.Count - 1);
using (var targetRange = xlApp.Range[leftColumn + (startingRow) + ":" + rightBottom + (startingRow + dataTable.Rows.Count - 1)].WithComCleanup())
{
targetRange.Resource.Value2 = values;
}

//Turn on Excel updating
SwitchApplicationSettings(xlApp,true);
}

static public void SwitchApplicationSettings(Excel.Application xlApp, bool on)
{
xlApp.ScreenUpdating = on;
xlApp.DisplayAlerts = on;
xlApp.Calculation = on ? XlCalculation.xlCalculationAutomatic : XlCalculation.xlCalculationManual;;
xlApp.UserControl = on;
xlApp.EnableEvents = on;
}

我使用 VSTO Contrib为了更好的内存管理。

使用对象模型不会比 VBA 慢 12 倍,除非您专门谈论单独填充数千个单元格。

关于c# - 与 VBA 相比,VSTO 性能较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com