我正在使用以下代码
SheetData sheetdata = worksheet.Worksheet.GetFirstChild<SheetData>();
System.Threading.Tasks.Parallel.For((excelStartRow + 1), (endRowvalue + 1),
(i) =>
{
Row contentRow = new Row();
//do something
Cell content = createTextCell(
dtspSheetData.Tables[0].Columns.IndexOf(column) + excelStartColumn, i,
dtspSheetData.Tables[0].Rows[j][column.ColumnName],
formatCount, 1, cellFormatCount);
contentRow.AppendChild(content);
sheetData.AppendChild(contentRow);
});
我尝试在使用 OpenXML 创建 Excel 时实现并行性。问题是在 Excel 文件中创建了行,但某些行未创建,并且在打开时显示警告。我知道,sheetData 对象在以下情况下被锁定:其他线程尝试将行插入到sheetData对象中。我该如何解决这个问题。
最佳答案
这些 Excel 对象并非设计为同时从多个线程访问。鉴于您在此循环中执行的唯一特别“昂贵”的任务是必须序列化的任务,因此最好的选择是在一个线程中的常规 for
循环中简单地完成整个任务。
如果实际上计算每个单元格的值很昂贵,那么您可能考虑使用并行循环来简单地生成每个单元格的内容,将它们放入内存中的某个中间存储位置,然后复制从单个线程将这些值传输到 Excel,但由于此循环似乎没有进行任何如此昂贵的计算,因此此处无需执行此操作。
关于c# - System.Threading.Tasks.Parallel.For 与 Openxml 出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22327645/