首页 > 解决方案 > 如何使用 Parallel.ForEach 从 excel 文件中读取单元格数据

问题描述

我正在使用 Microsoft.Office.Interop.Excel 读取 excel 文件,如下所示:

        Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(filePath);
        Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
        Microsoft.Office.Interop.Excel.Range range = sheet.UsedRange;


        var rangeValues = range.Value;
        List<string> EmailList = new List<string)();


          foreach (String str in rangeValues)
        {
            //addDataToList(EmailList, str); // add value to List<String>
            EmailList.Add(str);
        }

range.Value 是动态的,所以问题是如何使用 Parallel 从 excel 文件中读取单元格数据?有类似的东西:

        //    Parallel.ForEach(rangeValues, (str) => { addEmailToList(EmailList, str); }); 

标签: c#

解决方案


请参阅Office 中的线程支持

Office 对象模型不是线程安全的,但可以在 Office 解决方案中使用多个线程。Office 应用程序是组件对象模型 (COM) 服务器。COM 允许客户端在任意线程上调用 COM 服务器。对于非线程安全的 COM 服务器,COM 提供了一种串行化并发调用的机制,以便任何时候只有一个逻辑线程在服务器上执行。这种机制称为单线程单元 (STA) 模型。因为调用是序列化的,调用者可能会在服务器忙或正在处理后台线程上的其他调用时被阻塞一段时间。

即,即使您设法并行读取单元格,最好的情况是除了一个线程会阻塞,最坏的情况是您的应用程序会中断。

如果性能是一个问题,我建议找到另一种读取值的方法。应该有其他库可以更快地做到这一点。


推荐阅读