2013-05-28 52 views
3

我從Excel導出數據到DataTable,但是當我的Excel文件中包含大量行我得到一些性能問題......如何大量數據加載到數據表

public DataView LoadFromExcel() 
{ 
    Microsoft.Office.Interop.Excel.Application application = 
          new Microsoft.Office.Interop.Excel.Application(); 
    Workbook workbook = null; 
    Worksheet worksheet = null; 
    string filename = null; 
    OpenFileDialog file = new OpenFileDialog(); 
    if (true == file.ShowDialog()) 
    { 
     filename = file.FileName; 
    } 
    workbook = application.Workbooks.Open(filename, true, true); 
    worksheet = workbook.Sheets[1]; 
    Range range = worksheet.UsedRange; 
    int row = range.Rows.Count; 
    int columns = range.Columns.Count; 
    System.Data.DataTable dt = new System.Data.DataTable(); 
    for (int i = 1; i <= columns; i++) 
    { 
     dt.Columns.Add((range.Cells[1, i] as Range).Value2.ToString()); 
    } 
    for (row = 2; row <= range.Rows.Count; row++) 
    { 
     DataRow dr = dt.NewRow(); 
     for (int column = 1; column <= range.Columns.Count; column++) 
     { 
      dr[column - 1] = (range.Cells[row, column] as 
        Microsoft.Office.Interop.Excel.Range).Value2.ToString(); 
     } 
     dt.Rows.Add(dr); 
     dt.AcceptChanges(); 
    } 
    workbook.Close(true, Missing.Value, Missing.Value); 
    application.Quit(); 
    return dt.DefaultView; 
} 

有任何方式我可以解決這個問題?請幫忙。

+1

您不必一次性將所有記錄加載到內存中!響應式擴展(Rx)可能有助於數據流,並且在讀取記錄時,您只需訂閱它並在運行時處理它。 – David

+1

使用Interop很慢。你最好看看沒有它的讀取excel文件的.Net庫。 (Flexcel,Gembox,有很多[](http://stackoverflow.com/q/15828/861716))。 –

回答

1

我認爲這不是正確的做法。

要將大量數據插入到表中,應使用數據庫的「批量插入」功能,並在批量插入過程中,應關閉數據庫日誌和回滾功能。否則,批量插入操作就像一堆普通的插入操作一樣。

我知道Oracle和SQL Server有這個功能,一些NoSQL數據庫也有。既然你沒有提到你的數據庫是什麼,它有助於谷歌它。

-1

嘗試讀取變量的值並執行一些過濾器,以避免發送可能影響數據庫的錯誤值。 將未知數據保存到數據庫最爲棘手MS SQL - 做一些過濾,以便節省數據庫並保持數據庫健康。

1

您可以使用OLEDb提供程序的幫助。我曾試着做50000條記錄。它可以幫助你,只要嘗試下面的代碼:

 // txtPath.Text is the path to the excel file. 
     string conString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + txtPath.Text + ";" + "Extended Properties=" + "\"" + "Excel 12.0;HDR=YES;" + "\""; 

     OleDbConnection oleCon = new OleDbConnection(conString); 

     OleDbCommand oleCmd = new OleDbCommand("SELECT field1, field2, field3 FROM [Sheet1$]", oleCon); 

     DataTable dt = new DataTable(); 

     oleCon.Open(); 
     dt.Load(oleCmd.ExecuteReader()); 
     oleCon.Close(); 

你必須採取的一些事情護理:

  1. 片的名稱應該是Sheet1中或者在查詢提供正確的名稱。
  2. 閱讀紙張時,紙張不應該打開。
  3. 列名應在查詢中正確定義
  4. 列名應該是第一排在紙的

我希望它會幫助你... 讓我知道如果任何事情更多您需要... :)

1

您可以使用Sql批量複製來執行此類操作。