Проблема заключается в том, что вы вызываете объект Excel для каждой ячейки; это медленная работа в лучшие времена, поэтому делать это для большого количества ячеек займет много времени. У меня был случай этого не так давно: 4000 строк с 9 столбцами заняли около 44 секунд для перевода в Excel.
Мое текущее решение включает создание файла csv, а затем импорт этого csv в Excel.
const
fn = 'c:\windows\temp\csv.csv';
var
csv: tstringlist;
row, col: integer;
s: string;
begin
csv:= tstringlist.create;
for row:= 1 to stringgrid1.rowcount do
begin
s:= '';
for col:= 0 to stringgrid1.ColCount-1 do
s:= s + stringgrid1.Cells[col, row-1] + ',';
csv.add (s)
end;
csv.savetofile (fn);
csv.free;
objExcel := TExcelApplication.Create(nil);
objExcel.workbooks.open (fn);
deletefile (fn);
end;
Другой способ исходит из Mike Shkolnik, который я цитирую как:
var
xls, wb, Range: OLEVariant;
arrData: Variant;
begin
{create variant array where we'll copy our data}
arrData := VarArrayCreate([1, yourStringGrid.RowCount, 1, yourStringGrid.ColCount], varVariant);
{fill array}
for i := 1 to yourStringGrid.RowCount do
for j := 1 to yourStringGrid.ColCount do
arrData[i, j] := yourStringGrid.Cells[j-1, i-1];
{initialize an instance of Excel}
xls := CreateOLEObject('Excel.Application');
{create workbook}
wb := xls.Workbooks.Add;
{retrieve a range where data must be placed}
Range := wb.WorkSheets[1].Range[wb.WorkSheets[1].Cells[1, 1],
wb.WorkSheets[1].Cells[yourStringGrid.RowCount, yourStringGrid.ColCount]];
{copy data from allocated variant array}
Range.Value := arrData;
{show Excel with our data}
xls.Visible := True;
end;
Я предлагаю вам попробовать оба метода и посмотреть, что быстрее для ваших целей.
спасибо за быстрый ответ, ребята. Я думаю, что метод массива лучше всего подходит для моей ситуации прямо сейчас, потому что я не буду использовать CSV-файл. как я могу отметить этот вопрос как «разрешенный»? – dapidmini