2016-12-26 62 views
2

我正在使用c#VSTO和Interop lib來開發Excel加載項。用於在將這些值粘貼到具有格式的其他工作簿之前驗證每個單元格的值。我的實際查詢是用一些標準來處理單元格(以最快的方式)。使用多線程處理大型Excel文件

我已經使用WorkSheet.Cells.SpecialCells()獲取我感興趣的Excel.Range對象,並使用線程同時處理Excel.Range(由SpecialCells()返回)。 以下是一些的意見/問題:

  1. 看來Excel.Range依據不能分割偏移量和長度(即我不能得到基於一些現有的範圍抵消新的Range對象和計數)
  2. 如果我們在線程中共享範圍對象並試圖以不同批次處理單元格,我們會得到以下異常: 「消息過濾器指示應用程序正忙(來自HRESULT的異常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))」留下那批細胞未處理。

解決上述問題的任何輸入或指針都會有所幫助。在任何時候處理大型Excel文件的任何建議,在幾秒鐘內(這是現在最大的瓶頸)

+1

我期望在這些對Range對象的調用中進行的COM工作不喜歡多個線程。如果您只需要讀取和寫入新的工作表,可以查看[OpenXML SDK](https://msdn.microsoft.com/en-us/library/office/bb448854.aspx)或完全託管的C# Excel庫,如[EPPLUS](http://epplus.codeplex.com/) – rene

+0

感謝您的信息。 。 ..我會考慮這兩個選項 –

回答

2

Excel本質上是一個單線程應用程序(技術上,COM對象住在單線程的公寓)。這意味着任何COM訪問都會自動封送到主線程,因此使用額外線程進行COM調用沒有任何好處。

對於您的用例,將整個數據數組調入Range.Value,然後在不使用額外的COM調用的情況下進一步處理該數組,可能會有意義。

您可能還會看看this question以瞭解如何快速讀取和寫入範圍數據的想法,包括使用Excel C API的示例。

不同的方法是直接讀取Excel數據文件,而不是與Excel應用程序交互。爲此,您可以使用基於xml的文件格式(如ClosedXML)的高級包裝器。

+0

感謝您的指針和COM信息。我會相應地更新處理。建議陣列將在我的情況下工作。 –