unit TmsFlexcelExports;
interface
Uses
Windows, System.SysUtils, System.Classes, VCL.FlexCel.Core,
FlexCel.XlsAdapter, Data.DB;
procedure DataSetToXLS(fName: string; DataSet: TDataSet;
WorkSheetCount: Integer = 1; ActiveSheet: Integer = 1);
procedure DataSetToCSV(fName: string; DataSet: TDataSet;
WorkSheetCount: Integer = 1; ActiveSheet: Integer = 1);
implementation
procedure DataSetToXLS(fName: string; DataSet: TDataSet;
WorkSheetCount: Integer = 1; ActiveSheet: Integer = 1);
var
ioldrecno, icol, irow: Integer;
fmt: TFlxFormat;
fmtDateTime: Integer;
XLSX: TExcelFile;
begin
XLSX := TXlsFile.Create(True);
try
ioldrecno := DataSet.RecNo;
if SameText(ExtractFileExt(fName), '.XLSX') then
XLSX.SupportsXlsx := True;
XLSX.NewFile(WorkSheetCount, TExcelFileFormat(5));
// 4 = V2016 3 = V2013 2 = v2010, 1 = v2007, 0 = v2003
XLSX.ActiveSheet := ActiveSheet;
fmt := XLSX.GetDefaultFormat;
fmt.Format := 'yyyy-mm-dd HH:MM:SS AM/PM';
fmtDateTime := XLSX.AddFormat(fmt);
irow := 1;
for icol := 0 to DataSet.FieldCount - 1 do
begin
XLSX.SetCellValue(irow, icol + 1, DataSet.Fields[icol].DisplayName);
end;
inc(irow);
DataSet.First;
while Not DataSet.EOF do
begin
for icol := 0 to DataSet.FieldCount - 1 do
begin
case DataSet.Fields[icol].DataType of
ftUnknown, ftString, ftBoolean, ftBCD, ftBytes, ftVarBytes, ftAutoInc,
ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle,
ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftADT, ftArray,
ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant,
ftInterface, ftIDispatch, ftGuid, ftFMTBcd, ftFixedWideChar,
ftWideMemo, ftOraInterval, ftConnection, ftParams, ftStream,
ftTimeStampOffset, ftObject:
begin
XLSX.SetCellValue(irow, icol + 1, DataSet.Fields[icol].AsString);
end;
ftSmallint, ftInteger, ftWord, ftLargeint, ftLongWord, ftShortint,
ftByte, ftSingle:
begin
XLSX.SetCellValue(irow, icol + 1, DataSet.Fields[icol].AsInteger);
end;
ftDate, ftTime, ftDateTime, ftOraTimeStamp, ftTimeStamp:
begin
XLSX.SetCellValue(irow, icol + 1,
DataSet.Fields[icol].AsDateTime);
XLSX.SetCellFormat(irow, icol + 1, fmtDateTime);
end;
ftExtended, ftFloat, ftCurrency:
begin
XLSX.SetCellValue(irow, icol + 1, DataSet.Fields[icol].AsFloat);
end;
end;
end;
inc(irow);
DataSet.Next;
end;
DataSet.RecNo := ioldrecno;
XLSX.Save(fName);
finally
XLSX.Free;
end;
end;
procedure DataSetToCSV(fName: string; DataSet: TDataSet;
WorkSheetCount: Integer = 1; ActiveSheet: Integer = 1);
var
ioldrecno, icol, irow: Integer;
fmt: TFlxFormat;
fmtDateTime: Integer;
XLSX: TExcelFile;
begin
XLSX := TXlsFile.Create(True);
try
ioldrecno := DataSet.RecNo;
if SameText(ExtractFileExt(fName), '.XLSX') then
XLSX.SupportsXlsx := True;
XLSX.NewFile(WorkSheetCount, TExcelFileFormat(5));
// 4 = V2016 3 = V2013 2 = v2010, 1 = v2007, 0 = v2003
XLSX.ActiveSheet := ActiveSheet;
fmt := XLSX.GetDefaultFormat;
fmt.Format := 'yyyy-mm-dd HH:MM:SS AM/PM';
fmtDateTime := XLSX.AddFormat(fmt);
irow := 1;
for icol := 0 to DataSet.FieldCount - 1 do
begin
XLSX.SetCellValue(irow, icol + 1, DataSet.Fields[icol].DisplayName);
end;
inc(irow);
DataSet.First;
while Not DataSet.EOF do
begin
for icol := 0 to DataSet.FieldCount - 1 do
begin
case DataSet.Fields[icol].DataType of
ftUnknown, ftString, ftBoolean, ftBCD, ftBytes, ftVarBytes, ftAutoInc,
ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle,
ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftADT, ftArray,
ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant,
ftInterface, ftIDispatch, ftGuid, ftFMTBcd, ftFixedWideChar,
ftWideMemo, ftOraInterval, ftConnection, ftParams, ftStream,
ftTimeStampOffset, ftObject:
begin
XLSX.SetCellValue(irow, icol + 1, DataSet.Fields[icol].AsString);
end;
ftSmallint, ftInteger, ftWord, ftLargeint, ftLongWord, ftShortint,
ftByte, ftSingle:
begin
XLSX.SetCellValue(irow, icol + 1, DataSet.Fields[icol].AsInteger);
end;
ftDate, ftTime, ftDateTime, ftOraTimeStamp, ftTimeStamp:
begin
XLSX.SetCellValue(irow, icol + 1,
DataSet.Fields[icol].AsDateTime);
XLSX.SetCellFormat(irow, icol + 1, fmtDateTime);
end;
ftExtended, ftFloat, ftCurrency:
begin
XLSX.SetCellValue(irow, icol + 1, DataSet.Fields[icol].AsFloat);
end;
end;
end;
inc(irow);
DataSet.Next;
end;
DataSet.RecNo := ioldrecno;
XLSX.Save(fName, TFileFormats.Text, ',', TEncoding.Unicode);
// XLSX.Save(fName);
finally
XLSX.Free;
end;
end;
end.