如何将大数据(> 1mln)导出到excel文件,仅使用interop.excel

问题描述 投票:0回答:1

我需要导出大量数据] 100万。这是完成的功能,但是工作非常缓慢。

 public void ExportToExcel(string path)
        {
            var doc = new Excel.Application();
            var wb = doc.Workbooks.Add();
            Excel._Worksheet ws = (Excel.Worksheet)doc.ActiveSheet;
            ws.Cells[1, "A"] = "Дата";
            ws.Cells[2, "B"] = "Имя";
            ws.Cells[3, "C"] = "Фамилия";
            ws.Cells[4, "D"] = "Отчество";
            ws.Cells[5, "E"] = "Город";
            ws.Cells[6, "F"] = "Страна";
            var check = pers.AsNoTracking().ToList();

            for (int i = 0; i < check.Count(); i++)
            {
                ws.Cells[i + 2, "A"] = check.ElementAt(i).Date;
                ws.Cells[i + 2, "B"] = check.ElementAt(i).FirstName;
                ws.Cells[i + 2, "C"] = check.ElementAt(i).LastName;
                ws.Cells[i + 2, "D"] = check.ElementAt(i).SurName;
                ws.Cells[i + 2, "E"] = check.ElementAt(i).City;
                ws.Cells[i + 2, "F"] = check.ElementAt(i).Country;
            }

            wb.SaveAs(path);
        }

据我了解,List沿这种方式运行了很长时间,我创建了断点,在10秒内只有1000条记录。这非常糟糕。

有没有任何方法可以快速写入Excel。我可以使用其他收藏集吗?我需要达到至少10到20秒的速度才能插入100万个数据。

c# database office-interop
1个回答
0
投票

有两种方法可以加快速度:

  • 使用OLEDB连接到Excel和SQL查询(这需要安装连接器)。这是最快的方法。
  • 一口气写大数组,而不是逐行写。这仍然需要一段时间,但比您目前的操作方式要快得多。

使用OLEDB:

System.Data.OleDb.OleDbConnection conn ;
System.Data.OleDb.OleDbCommand cmd = New System.Data.OleDb.OleDbCommand();
String sql = null;
MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\\path\\to\\excelfile.xls';Extended Properties=Excel 8.0;");
conn.Open();
cmd.Connection = conn;
sql = "Insert into [Sheet1$] (id,name) values('5','e')";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
conn.Close();

要使用阵列,您必须先建立阵列:

//10 rows, 5cols
string[,] array = new string[10, 5];
...assign array
Range("A1:E10").value=array;

如上所述,一次编写大型数组比逐行编写要快得多,这在使用excel interop时会非常缓慢。

© www.soinside.com 2019 - 2024. All rights reserved.