2016-01-19 56 views
-1

我想用spreadsheetgear和Parallel.ForEach生成一个用于在单元格中写入的excel文件,并且我有时会得到空引用异常。有没有我需要做的配置或配置?电子表格并行

回答

4

如果您打算在多个线程上同时执行同一工作簿,则每个线程都必须通过IWorkbookSet获取/释放锁。 GetLock()和ReleaseLock()在相应的IWorkbookSet上同时在工作簿上执行此操作。否则,您可以以意外状态访问工作簿,并且可能会发生各种看似随机的例外情况。例如:

// Create a new "workbook set". 
IWorkbookSet wbs = Factory.GetWorkbookSet(); 

// Add a workbook under this "workbook set". 
IWorkbook workbook = wbs.Workbooks.Add(); 
IWorksheet worksheet = workbook.ActiveWorksheet; 

// Do your task (here I just insert single characters into cells in the sheet). 
Parallel.ForEach("ABCDEFG", (char c) => { 
    // Must acquire a workbook set lock before doing anything to the workbook! 
    wbs.GetLock(); 
    try 
    { 
     // Get next row to add character. 
     int nextRow = worksheet.UsedRange.Row + worksheet.UsedRange.RowCount; 

     // Add character to cell. 
     worksheet.Cells[nextRow, 0].Value = c; 
    } 
    finally 
    { 
     // Must release the workbook set lock. 
     wbs.ReleaseLock(); 
    } 
}); 

至少在这个简单的例子,这种方法不提供性能益处,因为每个线程必须等待反过来访问的工作簿和字符添加到纸张上。实际上,这种方法当然更难性能相比,以更线性,非多线程的方式做这个任务。

因此,根据您的任务的具体情况以及它在工作簿上所做的工作量与可以更加成功地同时完成的其他事情相比,这种方法可能会或可能不会提供与更线性方法相比的性能优势。