在Excel中运行操作
我有一个Excel电子表格,我有一个.Net库,可以进行一些相当复杂的计算。 .Net程序集通过COM暴露给Excel中的VBA代码。
当我呼叫.Net库时,Excel UI线程在计算过程中被阻塞。
这可以防止用户与Excel进行交互,并且在某些情况下向用户指示标题栏中的Excel为(Not Responding)。
我对Excel 2010中的VBA了解不多,但有什么方法可以在不同的线程中产生对.Net库的调用,并向用户呈现“进行中”对话框?
这是可能的,但可能需要一点努力才能将所有东西连接起来。 有很多方法可以解决这个问题,其中之一可能如下所示:
BackgroundWorker
的DoWork
事件处理程序访问Excel对象模型。 如果要在计算过程中更新Excel,则BackgroundWorker
应使用ReportProgress
方法报告UI线程上的进度。 ProgressChanged
事件处理程序(在UI线程上运行)中,C#代码可以直接更新Excel对象模型,也可以调用VBA代码来执行更新。 有可能是,你不能在C#中使用另一个线程。 Excel是单线程应用程序,该线程是UI线程,因此使用Excel的对象模型将阻止UI。
另一种方法是使用OpenXmlSdk,并使用它在Excel的数据副本上执行您的操作,然后再将数据加载回来。根据数据大小和计算时间,它可能是非常值得的。 我在Word中使用了约100页的文档,并将处理时间从10分钟缩短到<30秒,这30秒中的大部分时间用于将数据导出到Word或从Word导入数据。 Excel在这方面往往要快一点。
使用VBA很难做到,因为Excel VBA几乎是单线程同步的。 但是,Excel 2010确实支持异步UDF:查看Excel DNA或Addin Express以获取从.NET执行此操作的一些帮助。
http://exceldna.codeplex.com/wikipage?title=Performing%20Asynchronous%20Work&referringTitle=Documentation
http://www.add-in-express.com/add-in-net/index.php
2:http://www.add-in-express.com/add-in-net/index.php
您也可以从基于C的XLL中执行此操作
http://msdn.microsoft.com/en-us/library/office/ff796219%28v=office.14%29.aspx
上一篇: Running Operation in Excel
下一篇: search for string in all sheets of an excel file using macros