Возможно, не все знают, что время пересылки данных из своего приложения в ячейки Excel можно существенно сократить, если пересылать все значения для некоторого диапазона разом. Для этого используется вариантный массив (см. функцию VarArrayCreate). Небольшой пример, который прилагается к письму, все подробно иллюстрирует.
Привожу полностью все файлы проекта:
Main.dfm
object Form1: TForm1 Left = 267Top = 137AutoScroll = FalseCaption = 'Экспорт результатов SELECT в Excel'ClientHeight = 277ClientWidth = 519Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'MS Sans Serif'Font.Style = []OldCreateOrder = FalsePosition = poScreenCenterPixelsPerInch = 96TextHeight = 13object Label1: TLabelLeft = 8Top = 4Width = 114Height = 13Caption = 'Предложение SELECT'endobject Label2: TLabelLeft = 8Top = 224Width = 91Height = 13Caption = 'Имя базы данных'endobject btnExport: TButtonLeft = 436Top = 20Width = 75Height = 25Caption = 'Экспорт'TabOrder = 0OnClick = btnExportClickendobject memSelect: TMemoLeft = 8Top = 20Width = 417Height = 197TabOrder = 1endobject edtDatabaseName: TEditLeft = 8Top = 240Width = 413Height = 21TabOrder = 2endobject queSelect: TQueryLeft = 24Top = 20endend |
Main.pas
unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Db, DBTables; type TForm1 = class(TForm)queSelect: TQuery;btnExport: TButton;memSelect: TMemo;edtDatabaseName: TEdit;Label1: TLabel;Label2: TLabel;procedure btnExportClick(Sender: TObject);private{ Private declarations }public{ Public declarations }end; var Form1: TForm1; implementation uses ComObj; {$R *.DFM} procedure TForm1.btnExportClick(Sender: TObject); var XL, // Приложение ExcelTableVals : Variant; // Врем. массив для переноса значений в Exceli, LineCounter, // Счетчик строк для переноса записей в ExcelqueSelectRecCount,queSelectFieldsCount : Integer;begin inherited;tryApplication.ProcessMessages;Screen.Cursor := crSQLWait; with queSelect dobeginSQL.Assign(memSelect.Lines);DatabaseName := edtDatabaseName.Text;Open; {AMA: Экспорт в Excel} queSelectRecCount := RecordCount;queSelectFieldsCount := FieldCount;TableVals := VarArrayCreate([0, queSelectRecCount-1,//кол-во строк0, queSelectFieldsCount-1], // кол-во столбцовvarOleStr); First;LineCounter := 0;while not EOF dobeginfor i := 0 to queSelectFieldsCount-1 doif not Fields[i].IsNull thenTableVals[LineCounter, i] := Fields[i].AsStringelseTableVals[LineCounter, i] := '';LineCounter := LineCounter + 1;Next;end;Close;end; trytryXL := GetActiveOleObject('Excel.Application');exceptXL := CreateOleObject('Excel.Application');end;exceptraise Exception.Create('Не могу запустить Excel');end; XL.Visible := True;XL.Workbooks.Add;XL.Range[XL.Cells[1,1],XL.Cells[queSelectRecCount,queSelectFieldsCount]].Value := TableVals;XL.Range[XL.Cells[1,1],XL.Cells[queSelectRecCount,queSelectFieldsCount ]].Borders.Weight := 2;finallyScreen.Cursor := crDefault;end;end; end. |
SelectToExcel.dpr
program SelectToExcel; uses Forms,Main in 'Main.pas' {Form1}; {$R *.RES} begin Application.Initialize;Application.CreateForm(TForm1, Form1);Application.Run;end. |
[000845]