Vấn đề là bạn đang gọi đối tượng Excel cho mỗi tế bào; đây là một hoạt động chậm ở thời điểm tốt nhất, do đó, làm điều này cho một số lượng lớn các tế bào sẽ mất một thời gian dài. Tôi đã có một trường hợp này cách đây không lâu: 4000 hàng với 9 cột mất khoảng 44 giây để chuyển sang Excel.
Giải pháp hiện tại của tôi liên quan đến việc tạo tệp csv, sau đó nhập csv đó vào 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;
Một cách khác xuất phát từ Mike Shkolnik mà tôi đang trích dẫn như là:
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;
tôi đề nghị bạn nên thử cả hai phương pháp và xem đó là nhanh hơn cho mục đích của bạn.
Nguồn
2013-05-20 03:19:07
cảm ơn phản hồi nhanh, các bạn. Tôi nghĩ rằng phương pháp mảng là tốt nhất cho tình hình của tôi ngay bây giờ bởi vì tôi sẽ không sử dụng tệp .csv. làm cách nào để gắn cờ câu hỏi này là "Đã giải quyết"? – dapidmini