如何将大量数据加载到DataTable

时间:2013-05-28 06:48:44

标签: c# .net excel office-interop

我将数据从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;
}

有什么方法可以解决这个问题吗?请帮忙。

4 个答案:

答案 0 :(得分: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. 列名称应位于工作表的第一行
  5. 我希望它会帮助你...... 如果你需要更多的东西,请告诉我......:)

答案 1 :(得分:1)

您可以使用Sql批量复制来执行此类操作。

答案 2 :(得分:1)

我认为这不是正确的方法。

要将大量数据插入表中,您应使用数据库的“批量插入”功能,在批量插入期间,应关闭数据库日志和回滚功能。否则,批量插入物就像一堆普通的插入物一样。

我知道Oracle和SQL Server具有此功能,并且一些NoSQL数据库也具有此功能。由于您没有提到您的数据库是什么,因此谷歌搜索它会很有帮助。

答案 3 :(得分:-1)

尝试将值读取到变量并执行一些过滤器,以避免发送可能影响数据库的错误值。 将未知数据保存到数据库是错误的,尤其是MS SQL - 进行一些过滤以使保存更容易并保持数据库运行状况。