Here is the code:
procedure TMain_frm.Bt_test_export_to_xlsxClick(Sender: TObject);
var
workbook: TsWorkbook;
worksheet: TsWorksheet;
t: TTime;
begin
try
workbook := TsWorkbook.Create;
try
worksheet := workbook.AddWorksheet('Sheet1');
// worksheet.WriteFontStyle(0, 1, [fssBold]);
workbook.Options := [boVirtualMode, boBufStream];
workbook.VirtualColCount := DBGrid1.DataSource.DataSet.FieldCount;
workbook.VirtualRowCount := 2; //DBGrid1.DataSource.DataSet.RecordCount;
workbook.OnWriteCellData := @WriteCellDataHandler;
t := Now;
workbook.WriteToFile('test_virtual_01.xlsx', sfOOXML, true);
//workbook.WriteToFile('test_virtual_02.xls', sfExcel2, true);
t := Now - t;
finally
workbook.Free;
end;
finally
//
end;
end;
procedure TMain_frm.WriteCellDataHandler(Sender: TObject; ARow, ACol: Cardinal; var AValue: variant; var AStyleCell: PCell);
begin
if ARow = 0 then begin
AValue := DBGrid1.DataSource.DataSet.Fields[ACol].FieldName; //MyDatabase.Fields[ACol].FieldName;
DBGrid1.DataSource.DataSet.First;
end else begin
AValue := DBGrid1.DataSource.DataSet.Fields[ACol].AsVariant;
if ACol = DBGrid1.DataSource.DataSet.FieldCount-1 then DBGrid1.DataSource.DataSet.Next;
end;
end;
The Access file is opened with a odbc connection.
paramaters:
Persist Security Info=False;
Extended Properties="DSN=MS Access Database;
DBQ=d:\Programma\Oefen\DBase\test.mdb;
DefaultDir=d:\Programma\Oefen\DBase;
DriverId=25;
FIL=MS Access;
MaxBufferSize=2048;
PageTimeout=5;
UID=admin;