VSTO与VBA相比性能下降
我是新的stackoverflow因此,我会直接从我的问题开始。
我有几年的经验,通过集成的VBA开发macros的Excel,半年前我开始学习新的C#语言。 我喜欢它,这是可能性,我也find了通过Visual Studio直接在C#中开发Office插件(需要VSTO)的选项。 我的问题是,在做了多个testing之后,我试图比较使用C#创build的插件和使用VBA创build的macros的速度(例如,将string“testingstring”粘贴到每个单元格从A1到A10 000单独)。 问题是集成的VBA比使用Visual Studio(C#)创build的Addin快了好几倍。 当时我决定不打扰这个问题,但是后来我遇到了同样的问题,但是这次却不是cca 10秒(VBA)的过程花了2分多钟!
经过对google的研究,我发现VSTO在性能方面并不好,特别是当你需要你的应用程序与Excel交互的时候(所以有办法如何解决这个问题,比如把你的数据保存到dynamic数组中,然后直接填充整个数组放入activesheet); 然而,有些情况下,你只需要与Excel进行交互(就像我必须dynamic解除工作簿中的许多工作表一样…在这里你只需要说ActiveSheet.Unprotect)
我对你们的问题是,有没有什么办法,除了从慢的VSTO,如何创build(也许一些其他软件)Addins的Excel / Word /其他Office产品,很容易部署? 非常感谢你。
问候,罗伯特
单独填充10000个单元使您认为VSTO非常慢。 我可以用你提到的dynamic数组方法在一小段时间内做到这一点:
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更好的内存pipe理。
使用对象模型不比VBA慢12倍,除非您专门讨论单独填充数千个单元格。
VSTO-Excel的性能问题是由于需要在VBA / VB6使用的Excel接口上添加Interop层。 所以使用这种方法的VSTO与Excel的交互总是很慢。
可以使用XLL接口与C#使用Excel DNA(免费)和Addin Express(不免费)等产品。 使用这个接口将是快速的,但它比Com接口更有限。
下面是开发UDF的各种技术的比较。
分发VBA代码很容易 – 可以创build一个在应用程序级别运行的Addin(XLA / XLAM),或者为embedded的VBA代码分发一个工作簿,以获得针对文档的解决scheme。