2016-12-26 148 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信息。我会相应地更新处理。建议阵列将在我的情况下工作。 –