使用多线程处理大型 Excel 文件
Processing large Excel files using multiple threads
我正在使用 c# VSTO 和 Interop lib 开发 excel 加载项。用于在将这些值粘贴到另一个具有格式的工作簿之前验证每个单元格的值。我的实际查询是(以最快的方式)处理具有某些条件的单元格。
我使用 WorkSheet.Cells.SpecialCells() 获取我感兴趣的 Excel.Range 个对象,并同时使用线程处理 Excel.Range(由 SpecialCells() 返回)。
以下是 observations/issues 中的一些:
- 似乎 Excel.Range 无法根据偏移量和长度进行拆分(即我无法根据某些偏移量和计数从现有范围中获取新的范围对象)
- 如果我们在线程中共享范围对象并尝试以不同的批次处理单元格,我们会得到以下异常:
"The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))" 这也使那批细胞未被处理。
解决上述问题的任何输入或指示都会有所帮助。还有关于快速处理大型 excel 文件的任何建议,比如几秒钟(这是目前最大的瓶颈)
Excel 本质上是一个单线程应用程序(从技术上讲,COM 对象位于单线程单元中)。这意味着任何 COM 访问都会自动编组到主线程,因此使用额外线程进行 COM 调用没有任何好处。
对于您的用例,在对 Range.Value
的单次调用中获取整个数据数组然后在不使用额外的 COM 调用的情况下进一步处理该数组是有意义的。
您还可以查看 this question 以获取有关如何快速读取和写入范围数据的想法,包括使用 Excel C API.
另一种方法是直接读取 Excel 数据文件,而不是与 Excel 应用程序交互。为此,您可以对基于 xml 的文件格式使用高级包装器,例如 ClosedXML.
我正在使用 c# VSTO 和 Interop lib 开发 excel 加载项。用于在将这些值粘贴到另一个具有格式的工作簿之前验证每个单元格的值。我的实际查询是(以最快的方式)处理具有某些条件的单元格。
我使用 WorkSheet.Cells.SpecialCells() 获取我感兴趣的 Excel.Range 个对象,并同时使用线程处理 Excel.Range(由 SpecialCells() 返回)。 以下是 observations/issues 中的一些:
- 似乎 Excel.Range 无法根据偏移量和长度进行拆分(即我无法根据某些偏移量和计数从现有范围中获取新的范围对象)
- 如果我们在线程中共享范围对象并尝试以不同的批次处理单元格,我们会得到以下异常: "The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))" 这也使那批细胞未被处理。
解决上述问题的任何输入或指示都会有所帮助。还有关于快速处理大型 excel 文件的任何建议,比如几秒钟(这是目前最大的瓶颈)
Excel 本质上是一个单线程应用程序(从技术上讲,COM 对象位于单线程单元中)。这意味着任何 COM 访问都会自动编组到主线程,因此使用额外线程进行 COM 调用没有任何好处。
对于您的用例,在对 Range.Value
的单次调用中获取整个数据数组然后在不使用额外的 COM 调用的情况下进一步处理该数组是有意义的。
您还可以查看 this question 以获取有关如何快速读取和写入范围数据的想法,包括使用 Excel C API.
另一种方法是直接读取 Excel 数据文件,而不是与 Excel 应用程序交互。为此,您可以对基于 xml 的文件格式使用高级包装器,例如 ClosedXML.