使用多个线程处理大型Excel文件

我正在使用C#VSTO和Interop lib来开发Excel加载项。 用于在将这些值粘贴到具有格式的其他工作簿之前validation每个单元格的值。 我的实际查询是处理,(以尽可能最快的方式)与一些标准单元格。

我已经使用WorkSheet.Cells.SpecialCells()获取我感兴趣的Excel.Range对象,并使用线程来同时处理Excel.Range(由SpecialCells()返回)。 以下是一些观察/问题:

  1. 看来Excel.Range不能根据偏移和长度分割(即我不能从现有的范围基于一些偏移量和计数得到新的范围对象)
  2. 如果我们在线程中共享范围对象并试图以不同批次处理单元格,我们得到以下exception:“消息filter指示应用程序正忙(从HRESULTexception:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))”这也留下批次细胞未处理。

任何解决上述问题的input或指针都会有所帮助。 另外,任何有关处理大型Excel文件的build议都可以在几秒内完成(这是目前最大的瓶颈)

Excel基本上是一个单线程应用程序(技术上说,COM对象住在一个单线程的公寓)。 这意味着任何COM访问都会自动封送到主线程,所以使用额外线程进行COM调用没有任何好处。

对于你的用例,将整个数据数组调用到Range.Value ,然后在不使用额外COM调用的情况下进一步处理这个数组是Range.Value

您也可以查看这个问题 ,了解如何快速读取和写入范围数据,包括使用Excel C API的示例。

不同的方法是直接读取Excel数据文件,而不是与Excel应用程序交互。 为此,您可以使用基于xml的文件格式(如ClosedXML)的高级包装器。