2011-08-16 16 views
2

我正在尋找一種導出IEnumerable到Excel 2007(.xlsb)的好方法。 T是已知類型,因此性能方面的原因並不完全需要反射。 我使用.xlsb(excel二進制格式),因爲Excel的數據量會很大。IEnumerable <T>到Excel(2007)w /格式化

有問題的IEnumerable有大約200萬條記錄。從Access數據庫(.mdb)中檢索IEnumerable,然後進行一些處理,然後寫入LINQ查詢以生成T的報告結構。雖然這些記錄不需要作爲一個發送到excel(也不可能) ;它將被細分爲最大記錄長度約爲100萬條記錄的條件。

我希望能夠將數據轉換爲Excel數據透視表以便於查看。

我最初的想法是將IEnumerable轉換爲2Darray [,],然後使用COM互操作推入Excel範圍。

public static object[,] To2DArray<T>(this IEnumerable<T> objectList) 
    { 
     Type t = typeof(T); 
     PropertyInfo[] fields = t.GetProperties(); 

     object[,] my2DObject = new object[objectList.Count(), fields.Count()]; 

     int row = 0; 

     foreach (var o in objectList) 
     { 
      int col = 0; 
      foreach (var f in fields) 
      { 
       my2DObject[row, col] = f.GetValue(o, null) ?? string.Empty; 
       col++; 
      } 
      row++; 
     } 

     return my2DObject; 
    } 

然後我把這個對象[,],做了「交易分裂」,因爲我把它叫做剛剛分手的對象[,]成小塊,例如我想創建一個列表,然後通過每一個,並使用類似的東西發送到Excel範圍:

Excel.Range range = worksheet.get_Range(cell,cell); 
range.Value2 = List<object[,]>[0] 

我會很明顯環以上,但只是爲了簡單起見,它看起來像上面。 雖然這將工作,但需要大量的時間來處理,超過30分鐘。

雖然我已經涉足IEnumerable輸出到CSV,但效率也不是很高;由於它首先需要創建.csv文件,因此使用COM interop打開.csv文件以執行Excel數據透視表格式化。

我的問題:有沒有更好的(首選)方法來做到這一點? 我應該在迭代之前強制執行(toList())嗎?

我應該使用不同的機制來輸出/顯示數據嗎? 我打開任何選項來獲得斷開的IEnumerable以有效的方式文件。

- 我不會反對使用類似SQL Express的東西。

+0

你有沒有使用過SSIS?你可以創建一個包來處理導出,轉換(我假設你在IEnumerable中做的)並導入到excel中。 –

+0

我會看看它的感謝,在中間 - 我只是分開交易,一次推送大約2k條記錄的數據;假設Excel緩衝不好,因爲上述過程對於相同數量的數據只需要大約25秒。 –

回答

0

主要問題將是瓶頸在哪裏。我會看一下分析器中的代碼,看看哪部分執行需要很長時間。通過運行該進程並查看是否缺少CPU或內存,或者是否磁盤鎖定,查看資源使用情況也值得一看。 如果您一次獲得2000條記錄的明智表現,那麼我懷疑內存資源可能是一個問題 - 使用您發佈的代碼,您將轉換IEnumerable(可以避免將完整數據集加載到內存中)轉換爲完全內存結構可能有一百萬條記錄 - 這取決於涉及的字段的大小和數量,這可能很容易成爲一個問題。 如果問題看起來像是創建Excel文件本身的時間(在這種情況下它不會立即聽起來像這樣),那麼COM互操作調用可以加起來,並且某些第三方Excel庫的目標是多在寫Excel文件時速度更快,特別是大量的記錄,所以不必使用Excel二進制格式和COM,我建議看看像EPPlus這樣的開放源代碼庫(http://epplus.codeplex.com/)並看到性能差異是什麼樣的。

相關問題