Вариант 1. Вставлять сразу диапазонами, а не в каждую ячейку:
| Код | void __fastcall TForm1::Button2Click(TObject *Sender) { TDateTime tm1, tm2; String Range; Variant A(OPENARRAY(int, (0, StringGrid1->ColCount)), varVariant); Variant XL, v0, v1;
tm1 = Time(); XL = CreateOleObject("Excel.Application"); XL.OlePropertySet("Visible", CheckBox1->Checked); v0 = XL.OlePropertyGet("Workbooks"); v0.OleProcedure("Add"); v1 = v0.OlePropertyGet("Item", 1).OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
for (int i = 0; i < StringGrid1->RowCount; i++) { for (int j = 0; j < StringGrid1->ColCount; j++) { A.PutElement(StringGrid1->Cells[j][i],j); } Range.printf("A%d:J%d", i+1, i+1); v1.OlePropertyGet("Range", Range.c_str()).OlePropertySet("Value", A); }
XL.OlePropertySet("DisplayAlerts",false); XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".xls")); XL.OleProcedure("Quit");
tm2 = Time(); ShowMessage("done with " + TimeToStr(tm2 - tm1)); }
|
Вариант 2. Сформировать строковый массив, слова в строках д.б. разделены символом табуляции и все это вставить через Clipboard.
| Код | void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList* data = new TStringList(); String line; TDateTime tm1, tm2; Variant XL, v0, v1;
tm1 = Time(); //вставим в Excel... XL = CreateOleObject("Excel.Application"); XL.OlePropertySet("Visible", CheckBox1->Checked); v0 = XL.OlePropertyGet("Workbooks"); v0.OleProcedure("Add"); v1 = v0.OlePropertyGet("Item", 1).OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
//добавляем строки в которых слова разделены Tab-ом, Excel - поймет... for (int i = 0; i < StringGrid1->RowCount; i++) { line = StringGrid1->Cells[0][i]; for (int j = 1; j < StringGrid1->ColCount; j++) { line = line + "\t" + StringGrid1->Cells[j][i]; } data->Add(line); } //в Clipboard... Clipboard()->AsText = data->Text;
v1.OlePropertyGet("Range", "A1:A1").OleProcedure("Select"); //например начиная с этой ячейки... v1.OleProcedure("Paste");
Clipboard()->Clear();
XL.OlePropertySet("DisplayAlerts",false); XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", ChangeFileExt(Application->ExeName, ".xls")); XL.OleProcedure("Quit");
tm2 = Time(); ShowMessage("done with " + TimeToStr(tm2 - tm1));
delete data; }
|
Взято с http://forum.codenet.ru |