Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将大量数据加载到DataTable_C#_.net_Excel_Office Interop - Fatal编程技术网

C# 如何将大量数据加载到DataTable

C# 如何将大量数据加载到DataTable,c#,.net,excel,office-interop,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 =

我正在将数据从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;
}
public DataView LoadFromExcel()
{
Microsoft.Office.Interop.Excel.Application应用程序=
新的Microsoft.Office.Interop.Excel.Application();
工作簿=空;
工作表=空;
字符串文件名=null;
OpenFileDialog文件=新建OpenFileDialog();
if(true==file.ShowDialog())
{
filename=file.filename;
}
工作簿=application.Workbooks.Open(文件名,true,true);
工作表=工作簿。工作表[1];
范围=工作表.UsedRange;
int row=range.Rows.Count;
int columns=range.columns.Count;
System.Data.DataTable dt=新的System.Data.DataTable();

对于(int i=1;i尝试读取变量的值,并进行一些筛选,以避免发送可能影响数据库的错误值。
将未知数据保存到数据库(尤其是MS SQL)是错误的-请执行一些筛选以使保存更容易并保持数据库运行状况。

您可以在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();
你必须注意以下几件事:

  • 工作表的名称应为Sheet1或在查询中提供正确的名称
  • 阅读工作表时,工作表不应打开
  • 应在查询中正确定义列名
  • 列名应位于工作表的第一行
  • 我希望它能帮助你。。。
    如果您还需要什么,请告诉我……:)

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

    我认为这不是正确的方法

    要向表中插入大量数据,应使用数据库的“大容量插入”功能,在大容量插入过程中,应关闭数据库日志和回滚功能。否则,大容量插入将像一堆普通插入一样工作


    我知道Oracle和SQL Server有此功能,一些NoSQL数据库也有此功能。因为您没有提到什么是您的数据库,所以可以用谷歌搜索它。

    您不必一次将所有记录加载到内存!反应式扩展(Rx)可能有助于流式传输数据,当读取记录时,您只需订阅该记录并在运行时处理它。使用互操作很慢。您最好看看在不使用它的情况下读取excel文件的.Net库。(Flexcel,Gembox,有一个)。