我正在尋找一種導出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的東西。
你有沒有使用過SSIS?你可以創建一個包來處理導出,轉換(我假設你在IEnumerable中做的)並導入到excel中。 –
我會看看它的感謝,在中間 - 我只是分開交易,一次推送大約2k條記錄的數據;假設Excel緩衝不好,因爲上述過程對於相同數量的數據只需要大約25秒。 –