Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用多线程处理大型Excel文件_C#_Excel_Multithreading_Interop - Fatal编程技术网

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

C# 使用多线程处理大型Excel文件,c#,excel,multithreading,interop,C#,Excel,Multithreading,Interop,我正在使用c#VSTO和互操作库开发excel加载项。用于在将这些值粘贴到另一个具有格式的工作簿之前验证每个单元格的值。我的实际查询是用一些条件(以最快的方式)处理单元格 我使用了worker.Cells.SpecialCells()获取我感兴趣的Excel.Range对象,并使用线程同时处理Excel.Range(由SpecialCells()返回)。 以下是一些意见/问题: 似乎是Excel。无法根据偏移量和长度分割范围(即,我无法根据某些偏移量和计数从现有范围中获取新的范围对象) 如果我们

我正在使用c#VSTO和互操作库开发excel加载项。用于在将这些值粘贴到另一个具有格式的工作簿之前验证每个单元格的值。我的实际查询是用一些条件(以最快的方式)处理单元格

我使用了worker.Cells.SpecialCells()获取我感兴趣的Excel.Range对象,并使用线程同时处理Excel.Range(由SpecialCells()返回)。 以下是一些意见/问题:

  • 似乎是Excel。无法根据偏移量和长度分割范围(即,我无法根据某些偏移量和计数从现有范围中获取新的范围对象)
  • 如果我们在线程中共享范围对象,并尝试在不同批次中处理单元格,则会出现以下异常: “消息筛选器指示应用程序正忙。(HRESULT的异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))”这也会使该批单元格未处理

  • 解决上述问题的任何输入或指针都会有所帮助。还有任何关于快速处理大型excel文件的建议,比如在几秒钟内(这是目前最大的瓶颈)

    excel本质上是一个单线程应用程序(从技术上讲,COM对象位于单线程单元中)。这意味着任何COM访问都会自动编组到主线程,因此使用额外线程进行COM调用没有任何好处

    对于您的用例,在对
    Range.Value
    的单个调用中获取整个数据数组,然后在不使用额外COM调用的情况下进一步处理该数组是有意义的

    您还可以了解如何快速读取和写入范围数据,包括使用ExcelCAPI的示例


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

    我希望在这些范围对象调用中使用的COM内容不喜欢多线程。如果你的唯一要求是读写一份新的工作表,可以查看或使用C#完全管理的Excel库,比如感谢提供的信息。。我将研究这两个选项谢谢你的指点和COM信息。我将相应地更新处理。正如建议的那样,数组将在我的情况下工作。