В настоящее время у меня есть приложение, которое берет информацию из базы данных SQLite и помещает ее в Excel. Однако мне нужно взять каждый DataRow, перебрать каждый элемент, поместить каждое значение в его собственную ячейку и определить выделение. Это вызывает 20 минут, чтобы экспортировать файл записи 9000 в Excel. Я уверен, что это можно сделать быстрее, чем это. Я думаю, что я мог бы использовать источник данных для заполнения диапазона Excel, а затем использовать заголовки столбцов и номера строк для форматирования только тех строк, которые необходимо отформатировать. Однако, когда я смотрю в Интернете, что бы я ни печатал, он всегда показывает примеры использования Excel в качестве базы данных, а не импорта в Excel. Если я не забыл ключевое слово или. Теперь эту функцию нужно выполнять в коде, поскольку она является частью более крупного приложения. В противном случае я бы просто подключил Excel к БД и извлек сам информацию. К сожалению, это не так. Буду признателен за любую информацию, которая может помочь мне в быстрой загрузке листа Excel. Спасибо.
Дополнительная информация:
Еще одна причина, по которой необходимо извлекать информацию из БД в коде, заключается в том, что не на каждом компьютере, на котором она загружена, будет работать Excel Это. Лицо, использующее приложение, может просто попросить экспортировать данные и отправить их по электронной почте своему руководителю. Приложение настройки включает в себя необходимые библиотеки для приложения в правильном формате.
Пример кода (текущий):
For Each strTemp In strColumns
excelRange = worksheet.Cells(1, nCounter)
excelRange.Select()
excelRange.Value2 = strTemp
excelRange.Interior.Color = System.Drawing.Color.Gray.ToArgb()
excelRange.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, Type.Missing)
nCounter += 1
Next
Теперь, это только пример кода с точки зрения итерации, которую я делаю. Там, где я действительно обрабатываю информацию из базы данных, я перебираю строки DataTable, затем перебираю элементы в dataRow и делаю по сути то же самое, что и выше; значение по значению, выбирая диапазон и помещая значение в ячейку, форматируя ячейку, если она является частью отчета (не всегда серой), и переходя к следующему набору данных. То, что я хотел бы сделать, это поместить все данные в таблицу Excel (A2: ??, не строка, а несколько строк), а затем выполнить итерации по отчетам и отформатировать каждую строку. Таким образом, единственный раз, когда я перебираю все записи, это когда каждая запись является частью отчета.
Идеальный код
excelRange = worksheet.Cells("A2", "P9000")
excelRange.DataSource = ds 'ds would be a queried dataSet, and I know there is no excelRange.DataSource.
'Iteration code to format cells
Обновление:
Я знаю, что мои примеры были на VB, но это потому, что я также пытался написать VB-версию приложения, так как мой босс предпочитает VB. Тем не менее, вот мой окончательный код с использованием набора записей. Функция ConvertToRecordset была получена из здесь .
private void CreatePartSheet(Excel.Worksheet excelWorksheet)
{
_dataFactory.RevertDatabase();
excelWorksheet.Name = "Part Sheet";
string[] strColumns = Constants.strExcelPartHeaders;
CreateSheetHeader(excelWorksheet, strColumns);
System.Drawing.Color clrPink = System.Drawing.Color.FromArgb(203, 192, 255);
System.Drawing.Color clrGreen = System.Drawing.Color.FromArgb(100, 225, 137);
string[] strValuesAndTitles = {/*...Column Names...*/};
List<string> lstColumns = strValuesAndTitles.ToList<string>();
System.Data.DataSet ds = _dataFactory.GetDataSet(Queries.strExport);
ADODB.Recordset rs = ConvertToRecordset(ds.Tables[0]);
excelRange = excelWorksheet.get_Range("A2", "ZZ" + rs.RecordCount.ToString());
excelRange.Cells.CopyFromRecordset(rs, rs.RecordCount, rs.Fields.Count);
int nFieldCount = rs.Fields.Count;
for (int nCounter = 0; nCounter < rs.RecordCount; nCounter++)
{
int nRowCounter = nCounter + 2;
List<ReportRecord> rrPartReports = _lstReports.FindAll(rr => rr.PartID == nCounter).ToList<ReportRecord>();
excelRange = (Excel.Range)excelWorksheet.get_Range("A" + nRowCounter.ToString(), "K" + nRowCounter.ToString());
excelRange.Select();
excelRange.NumberFormat = "@";
if (rrPartReports.Count > 0)
{
excelRange.Interior.Color = System.Drawing.Color.FromArgb(230, 216, 173).ToArgb(); //Light Blue
foreach (ReportRecord rr in rrPartReports)
{
if (lstColumns.Contains(rr.Title))
{
excelRange = (Excel.Range)excelWorksheet.Cells[nRowCounter, lstColumns.IndexOf(rr.Title) + 1];
excelRange.Interior.Color = rr.Description.ToUpper().Contains("TAG") ? clrGreen.ToArgb() : clrPink.ToArgb();
if (rr.Description.ToUpper().Contains("TAG"))
{
rs.Find("PART_ID=" + (nCounter + 1).ToString(), 0, ADODB.SearchDirectionEnum.adSearchForward, "");
excelRange.AddComment(Environment.UserName + ": " + _dataFactory.GetTaggedPartPrevValue(rs.Fields["POSITION"].Value.ToString(), rr.Title));
}
}
}
}
if (nRowCounter++ % 500 == 0)
{
progress.ProgressComplete = ((double)nRowCounter / (double)rs.RecordCount) * (double)100;
Notify();
}
}
rs.Close();
excelWorksheet.Columns.AutoFit();
progress.Message = "Done Exporting to Excel";
Notify();
_dataFactory.RestoreDatabase();
}