如何在线程安全庄园中迭代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
是实现IEnumerable
的Range
,但不是IEnumerable<T>
。 我认为基础项目也是Range
types的,所以你需要施放它们:
Parallel.ForEach(worksheet.Rows.Cast<Range>(), currentRow => { // do something });
这应该解决您的编译器错误,但不一定是您可能或不可能有的任何线程问题。
另外,我不知道这是否是一个好主意,首先迭代每一行。 大部分可用工作表空间的99.999%未被使用,但是这将遍历整个事情,根据Excel的版本,这可能会超过一百万行。