如何在线程安全庄园中迭代Excel文档

我完全不在这里,我承认我有点困惑,应该如何工作。 我有一个Excel文件,我试图parsing一个线程安全的方式。

这是我到目前为止:

public IEnumerable<DepartmentOfEnergyIndex> ParseJet(Workbook workbook) { var indecies = new ConcurrentQueue<DepartmentOfEnergyIndex>(); var worksheet = (Worksheet)workbook.Worksheets.Item["Data 6"]; Parallel.ForEach(worksheet.Rows, currentRow => { indecies.Enqueue( new DepartmentOfEnergyIndex { DOELastUpdated = currentRow[0], DollarsPerGallon = currentRow[1], RegionID = RegionEnum.USGC.ToInt(), }); }); return indecies.ToArray(); } 

我遇到的第一个问题(除了缺乏知识)是ForEach抛出一个编译器错误:

  Error 1 The type arguments for method 'System.Threading.Tasks.Parallel.ForEach<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Action<TSource>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. 

基于这个例子 。 这应该已经工作,但罚款worksheet.Rows是一个Microsoft.Office.Interop.Excel.Range:

 Parallel.ForEach<Range>(worksheet.Rows, currentRow => { //same stuff }); 

现在:

 Error 1 The best overloaded method match for 'System.Threading.Tasks.Parallel.ForEach<Microsoft.Office.Interop.Excel.Range>( System.Collections.Generic.IEnumerable<Microsoft.Office.Interop.Excel.Range>, System.Action<Microsoft.Office.Interop.Excel.Range>)' has some invalid arguments 

好的范围从IEnumerableinheritance,但实际上并不是IEnumerable。

那么如何在一个线程安全庄园里迭代这些行呢?

Rows是实现IEnumerableRange ,但不是IEnumerable<T> 。 我认为基础项目也是Rangetypes的,所以你需要施放它们:

 Parallel.ForEach(worksheet.Rows.Cast<Range>(), currentRow => { // do something }); 

这应该解决您的编译器错误,但不一定是您可能或不可能有的任何线程问题。

另外,我不知道这是否是一个好主意,首先迭代每一行。 大部分可用工作表空间的99.999%未被使用,但是这将遍历整个事情,根据Excel的版本,这可能会超过一百万行。