2012-11-27 73 views
2

我當前項目的一部分涉及從包含120,000多條記錄的大型SQL表填充Excel工作表。我目前使用SqlDataReader和while循環來直接填充一個新的Excel工作表,但顯然這需要不切實際的時間。使用StringBuilder建立一個本地.CSV文件然後打開在Excel中似乎是一個更快的選項。是否傾向於將數據轉儲至每一千行左右的文件,或者一次寫入全部數據?或者是否有更有效的方式來導入我不考慮的數據?將大型SQL查詢移至Excel

數據集根據用戶輸入而有所不同,所以我不能簡單地附加到現有文件。

當前代碼:

SqlConnection cnnct = new SqlConnection("Data Source=Source;Initial Catalog=Catalog;Integrated Security=True;"); 
      cnnct.Open(); 
      SqlCommand cmd = new SqlCommand(); 
      cmd.Connection = cnnct; 
      string cmdText = "SELECT * FROM TABLE"; 
      cmd.CommandText = cmdText; 

      SqlDataReader dr = cmd.ExecuteReader(); 
      while (dr.Read()) 
      { 
       columnChar = 'A'; 
       rowCount++; 

       cellName = columnChar.ToString() + rowCount.ToString(); 
        ws.get_Range(cellName, cellName).Value2 = dr["EXAMPLE_FIELD"].ToString(); 
        columnChar++; 
       //The above three lines are identical for each field (there are 26) 
      } 
+0

你有什麼試過的?你有性能測試來嘗試各種選擇嗎?您所顯示的代碼與編寫CSV文件無關。 –

+0

正如我在第一篇文章中所說的,我目前使用SqlDataReader和while循環來直接填充一個新的Excel工作表。我一直在探索不同的選擇,但是我在開始構建CSV之前尋找外部意見。我不在尋找代碼示例,我只是好奇,如果可能有一個更有效的選擇。 – ti30xa

回答

2

那麼,我會不惜一切代價避免Excel互操作。你只是寫一個.CSV文件的想法有很多好處。一如既往的「最佳」表現取決於環境,但單元測試總是有幫助的。

System.IO是相當優化的。我只需從SqlDataReader中讀取一行並寫入CSV行。它變得非常簡單的代碼,我敢打賭是相當「快」。

祝你好運。

0

在C#中使用DocumentFormat.OpenXml.Spreadsheet,您可以在此數據集中寫入Xlsx格式或創建XML文件using System.xml或使用THRID第三方工具/創建自己的Excel XML,創建XLS格式。

1

一個大問題是,您正在逐個填充Excel工作表,因爲每次調用.Value2設置器時都會進行COM互操作,因此速度很慢。

如果您爲Excel中所有要放入的數據(M行N列)分配一個數組,然後創建一個範圍對象來表示該範圍並將該數組複製到該範圍,那將會更快.Value2二傳手。