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;
}

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

4

4 回答 4

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. 列名应位于工作表的第一行

我希望它会帮助你......让我知道你是否需要更多...... :)

于 2013-05-28T07:00:47.657 回答
1

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

于 2013-05-28T07:02:09.540 回答
1

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

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

我知道 Oracle 和 SQL Server 有这个特性,一些 NoSQL 数据库也有。由于您没有提到您的数据库是什么,因此使用谷歌搜索它会有所帮助。

于 2013-05-28T07:11:35.143 回答
-1

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

于 2013-05-28T07:00:20.370 回答