2013-12-23 65 views
0

我在寫一個c#應用程序,該應用程序讀取Excel文件並根據Excel工作表中的每一行創建內存中的對象。我已使用for-loop成功完成此操作,但希望使用Parallel.Foreach來提高性能,因爲Excel文件包含超過90,000多條記錄。Parallel.Foreach on Excel.Range c#

我以前用對DataTable的對象,有什麼辦法可以用我的Excel.Range對象嗎?我需要逐行迭代excel數據。

任何示例都會有所幫助。

+0

確定並行處理將有助於在這裏?你分析了創建對象所需的時間嗎?瓶頸可能只是磁盤訪問。 – Gusdor

+0

對於Excel性能檢查[this](http://stackoverflow.com/a/17021537/1069200)。我不認爲Parallel.Foreach會做任何事情。批量讀取,然後從內存中讀取imo。 –

+0

所有你需要的是一個IEnumerable 。你的Excel庫可能會給你。研究文檔。 – usr

回答

0

我所限定的本方法這需要Excel.Range對象並使用PLINQ

private List<List<String>> ExcelRangeToLists(Excel.Range cells) 
{ 
    return cells.Rows.Cast<Excel.Range>().AsParallel().Select(row => 
    {   
     return row.Cells.Cast<Excel.Range>().Select(cell => 
     { 
     var cellContent = cell.Value2; 
     return (cellContent == null) ? String.Empty : cellContent.ToString();       
     }).Cast<string>().ToList();     
    }).ToList(); 
}); 

然後它轉變成列表,剛讀從Excel工作表的某一範圍,並調用此方法

var cells = xlSheet.get_Range("A3", "BK1555"); 
var data = ExcelRangeToLists(cells); 

測量性能會更好,但不會有太大的提高 - 例如,對於1400行的範圍,速度要快20%(對於大型設備來說應該更好)。

我沒有使用過Parallel.Foreach,因爲我需要select來創建列表,但基本的轉換思路是相似的。

Parallel.ForEach(cells.Rows.Cast<Excel.Range>(), row => DoSomethingWithRow(row)); 

享受