Более быстрый способ вставки строк в электронную таблицу Excel на C # с помощью oleDbCommand?

Поэтому я ищу более быстрый метод вставки в электронные таблицы на сервере. Сейчас это зависит от используемых данных, но занимает около 20 секунд, чтобы вставить 100 строк в одну таблицу. Я понимаю, почему он это делает, потому что вставка в электронную таблицу заставляет excel перемещать строки каждый раз при вставке новой строки. Таким образом, чем больше строк добавляется в одну таблицу, тем дольше это займет. Я тестировал эту теорию, и это было правильно, я создал около 100 электронных таблиц и случайно вставил 1000 строк, распределенных по всем их. Это заняло около 60 секунд. Вставка одних и тех же 1000 строк в одну таблицу потребовала более 5 минут. Вот мой код ниже:

string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source={0};Extended Properties='Excel 12.0;HDR=YES'", file); Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook(fileTemplate); Aspose.Cells.WorksheetCollection sheets = wb.Worksheets; Aspose.Cells.Worksheet sheet = wb.Worksheets[0]; wb.Save(file); combinedCount = 0; counter = 0; foreach (DataRowView drv in view)//check each row in our simplified view for ebid { if (combinedList[combinedCount][1] == "") //if its empty it goes into brandies sheet { sheet.Cells.InsertRow(2); using (OleDbConnection cn = new OleDbConnection(connectionString)) { cn.Open(); OleDbCommand cmd1 = new OleDbCommand("INSERT INTO [" + combinedList[combinedCount][0] + "$] " + //"+sheetCnt+" "([Reporting Retailer EBID],[Outlet BASF ID],[Retailer OT],[Mapped Grower ID],[Mapped Grower],[Ship To Grower],[Bill To Grower],[Transaction ID],[Product ID],[Product Description],[Quantity],[Invoice No],[Previously Sent],[Comments])" + "VALUES(@value1,@value2,@value3,@value4,@value5,@value6,@value7,@value8,@value9,@value10,@value11,@value12,@value13,@value14)", cn); cmd1.Parameters.AddWithValue("@value1", drv[0]);//retailer ebid cmd1.Parameters.AddWithValue("@value2", drv[1]);//outlet basf cmd1.Parameters.AddWithValue("@value3", drv[13]);//retailer ot cmd1.Parameters.AddWithValue("@value4", drv[2]);//mapped g id cmd1.Parameters.AddWithValue("@value5", drv[10]);//mapped g cmd1.Parameters.AddWithValue("@value6", drv[11]);//ship to g cmd1.Parameters.AddWithValue("@value7", drv[12]);//bill to g cmd1.Parameters.AddWithValue("@value8", drv[3]);//trans id cmd1.Parameters.AddWithValue("@value9", drv[4]);//prod id cmd1.Parameters.AddWithValue("@value10", drv[5]);//prod desc cmd1.Parameters.AddWithValue("@value11", drv[6]);//quantity cmd1.Parameters.AddWithValue("@value12", drv[7]);//invoice no cmd1.Parameters.AddWithValue("@value13", drv[8]);//prev sent cmd1.Parameters.AddWithValue("@value14", drv[9]);//comments cmd1.ExecuteNonQuery(); cn.Close(); } } } 

Ну, если вам нужно импортировать данные из некоторого источника данных (например, DataTable, Arrays, List и т. Д.) В рабочий лист MS Excel или экспортировать данные из рабочего листа для заполнения DataTable или массива и т. Д. За один раз, то вы можете попробовать соответствующие API Aspose.Cells (которые являются эффективными) для задачи. Вы должны проверить определенные методы класса Cells (например, Cells.ImportDataTable, Cells.ExportDataTable и т. Д. – есть и другие полезные методы.) Для ваших требований. Более того, ваш datatable будет вставлен таким образом, чтобы другое содержимое было смещено под таблицу соответственно.

1) См. Строку кода для импорта таблицы данных в рабочий лист:

 //Importing the contents of DataTable to the worksheet starting from "A1" cell, //where true specifies that the column names of the DataTable would be added to //the worksheet as a header row worksheet.Cells.ImportDataTable(dataTable, true, "A1"); 

2) Аналогичным образом см. Примерный сегмент кода при экспорте данных с рабочего листа для заполнения DataTable:

 //Exporting the contents of first 7 rows and 2 columns (A1:B7) starting from 1st cell to DataTable DataTable dataTable = worksheet.Cells.ExportDataTable(0, 0, 7, 2, true); 

Я работаю разработчиком / евангелистом в Aspose.

Я понял, как его значительно уменьшить. Как я уже говорил, вставка в функцию вызывает перегруз при работе с большими наборами данных. Поэтому настройте таргетинг на каждую ячейку и используйте функцию putvalue. Например:

  combinedCount = 0; counter = 0; int testCount = 2; foreach (DataRowView drv in view) { if (combinedCount != 0)//if its the first one, there is nothing to compare it to { if (combinedList[combinedCount - 1][0] == combinedList[combinedCount][0])//look at the previous one to check if its the same as the one before it, because we dont want to increment it everytime else it will increment on a different and empty page { testCount++; } else { testCount = 2; //2 is where our first row starts on each page } } else { } Aspose.Cells.Worksheet sheet = wb.Worksheets[combinedList[combinedCount][0]]; Aspose.Cells.Cell cell1 = sheet.Cells["A" + testCount]; Aspose.Cells.Cell cell2 = sheet.Cells["B" + testCount]; Aspose.Cells.Cell cell3 = sheet.Cells["C" + testCount]; Aspose.Cells.Cell cell4 = sheet.Cells["D" + testCount]; Aspose.Cells.Cell cell5 = sheet.Cells["E" + testCount]; Aspose.Cells.Cell cell6 = sheet.Cells["F" + testCount]; Aspose.Cells.Cell cell7 = sheet.Cells["G" + testCount]; Aspose.Cells.Cell cell14 = sheet.Cells["N" + testCount]; Aspose.Cells.Cell cell15 = sheet.Cells["O" + testCount]; Aspose.Cells.Cell cell16= sheet.Cells["P" + testCount]; Aspose.Cells.Cell cell17 = sheet.Cells["Q" + testCount]; Aspose.Cells.Cell cell18 = sheet.Cells["R" + testCount]; Aspose.Cells.Cell cell19 = sheet.Cells["S" + testCount]; Aspose.Cells.Cell cell20 = sheet.Cells["T" + testCount]; cell1.PutValue(drv[0]); cell2.PutValue(drv[1]); cell3.PutValue(drv[13]); cell4.PutValue(drv[2]); cell5.PutValue(drv[10]); cell6.PutValue(drv[11]); cell7.PutValue(drv[12]); cell14.PutValue(drv[3]); cell15.PutValue(drv[4]); cell16.PutValue(drv[5]); cell17.PutValue(drv[6]); cell18.PutValue(drv[7]); cell19.PutValue(drv[8]); cell20.PutValue(drv[9]); } 

Это немного неряшливо, но вы понимаете. 60 + secs опустились до 40 секунд, 25 секунд снизились до 15. Хотя все еще не молниеносно, вставка в электронную таблицу никогда не будет очень быстрой.

Еще одна проблема, которую я обнаружил, что время запуска до отдельных цифр является функцией сохранения. Я удалил сохранение из цикла foreach и вытащил его извне, он по-прежнему сохраняется правильно.

  • Запуск скрипта vba в Excel с помощью C #
  • Файл VSTO SaveAs заблокирован
  • Получать имена столбцов из файла excel определенного листа с использованием c # с OleDbConnection
  • Поворот оси X в таблице Excel c #
  • Эффективно конвертировать .xslx в .csv в C #?
  • Попытка подключения к электронной таблице Excel в C #
  • Для этого родителя разрешен только один экземпляр типа, но часть чертежа равна нулю
  • комбинации игроков для команды в C
  • Импорт нескольких XML-файлов в Excel
  • Чтение файлов Excel в C # всегда в системе .__ ComObject?
  • Как программно установить изображения для перемещения и размера с помощью ячеек?
  • Давайте будем гением компьютера.