Как экспортировать большие данные (> 1 млн.) В файл Excel, используя только interop.excel - PullRequest
0 голосов
/ 14 апреля 2020

Мне нужно экспортировать большие объемы данных> 1 миллиона. Вот готовая функция, но она работает очень медленно.

 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 секунд, чтобы вставить 1 миллион данных.

1 Ответ

0 голосов
/ 14 апреля 2020

Это можно ускорить двумя способами:

  • Использовать OLEDB-соединение с Excel и SQL запросы (для этого требуется установить соединитель). Это самый быстрый способ.
  • Записывайте большие массивы в один go вместо строки за строкой. Это все еще займет некоторое время, но это будет гораздо быстрее, чем в настоящее время.

Использование 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;

Запись большого массива за один go, как указано выше, намного быстрее, чем построчное перемещение, которое кропотливо замедляется при взаимодействии с Excel.

...