Rob*_* J. 0 c# excel performance vba vsto
我是stackoverflow的新手,因此我将直接从我的问题开始.
我有几年通过集成VBA为Excel开发宏的经验,半年前我开始学习新语言C#.我喜欢它,它的可能性,我也找到了通过Visual Studio直接在C#中开发Office插件的选项(需要VSTO).我遇到的问题是,在进行多次测试之后,我尝试比较使用C#创建的插件的速度和使用VBA创建的宏(例如,将字符串"测试字符串"粘贴到A1到A10 000的每个单元格中).问题是集成的VBA比使用Visual Studio(C#)创建的Addin快几倍.我当时决定不打扰这个问题,但是后来我遇到了同样的问题但是这一次而不是cca 10秒(VBA)过程耗时超过2分钟!
在谷歌上做研究之后我发现VSTO在性能方面表现不佳,特别是当你需要你的应用程序与Excel交互时(因此有办法解决问题,比如将数据保存到动态数组中,然后直接填充整个数组到activesheet); 然而,有些情况下,您只需要与excel进行交互(就像我必须动态地取消保护工作簿中的许多工作表...在这里,您只需要说ActiveSheet.Unprotect)
我的问题是,除了缓慢的VSTO之外,还有什么方法,如何创建(可能是其他一些软件)Addins for 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;
}
Run Code Online (Sandbox Code Playgroud)
我使用VSTO Contrib获得更好的内存mgt.
使用对象模型并不比VBA慢12倍,除非你专门讨论单独填充数千个单元格.
| 归档时间: |
|
| 查看次数: |
3526 次 |
| 最近记录: |