问题在于您为每个单元格调用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
arrData := VarArrayCreate([1, yourStringGrid.RowCount, 1, yourStringGrid.ColCount], varVariant);
for i := 1 to yourStringGrid.RowCount do
for j := 1 to yourStringGrid.ColCount do
arrData[i, j] := yourStringGrid.Cells[j-1, i-1];
xls := CreateOLEObject('Excel.Application');
wb := xls.Workbooks.Add;
Range := wb.WorkSheets[1].Range[wb.WorkSheets[1].Cells[1, 1],
wb.WorkSheets[1].Cells[yourStringGrid.RowCount, yourStringGrid.ColCount]];
Range.Value := arrData;
xls.Visible := True;
end;
我建议您尝试两种方法,看看哪一种更适合您的目的。