我有一個Excel電子表格,我有一個.Net庫,它可以完成一些相當複雜的計算。 .Net程序集通過COM暴露給Excel中的VBA代碼。Excel中的長時間運行
當我呼叫到.Net庫時,Excel UI線程在計算過程中被阻塞。
這可以防止用戶與Excel進行交互,並且在某些情況下向用戶指示Excel在標題欄中是(Not Responding)。
我不太瞭解Excel 2010中的VBA,但有什麼方法可以在不同的線程中產生對我的.Net庫的調用,並向用戶展示「進行中」對話框?
我有一個Excel電子表格,我有一個.Net庫,它可以完成一些相當複雜的計算。 .Net程序集通過COM暴露給Excel中的VBA代碼。Excel中的長時間運行
當我呼叫到.Net庫時,Excel UI線程在計算過程中被阻塞。
這可以防止用戶與Excel進行交互,並且在某些情況下向用戶指示Excel在標題欄中是(Not Responding)。
我不太瞭解Excel 2010中的VBA,但有什麼方法可以在不同的線程中產生對我的.Net庫的調用,並向用戶展示「進行中」對話框?
這是可能做到這一點,但可能需要一些努力來連線一切。有許多方法,你可以接近這一點,其中一個看起來是這樣的:
BackgroundWorker
的DoWork
事件處理程序訪問Excel對象模型。如果要在計算過程中更新Excel,則BackgroundWorker
應使用ReportProgress
方法報告UI線程上的進度。ProgressChanged
事件處理程序(它在UI線程上運行)中,C#代碼可以直接更新Excel對象模型,也可以調用VBA代碼來執行更新。有可能是NO,你不能在C#中使用另一個線程。 Excel是單線程應用程序,該線程是UI線程,因此使用Excel的對象模型將阻止UI。
另一種方法是使用OpenXmlSdk並使用它在單獨的線程上對Excel數據的副本執行操作,然後將數據加載回來。根據數據大小和計算時間,它可能非常值得。我在Word中使用了大約100頁的文檔,並將處理時間從10分鐘縮短到< 30秒,這30秒中的大部分時間用於將數據導出和導入到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
一個有點瘋狂的選擇(大多數VBA解決方案)並沒有被提及 - 你可以產生動態VBScripts,它可以作爲一個線程工作,並在後臺工作,並將它們綁定到Excel中。前段時間我在這個博客上看到了這個想法:http://www.databison.com/index.php/multithreaded-vba-an-approach-to-processing-using-vbscript/
這不是很優雅,但它是一個選項。
你應該使用Excel-dna來做到這一點。你將很容易用它調用異步操作。