Solved with this (my) code
unit MyExcel;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, fpspreadsheet, fpsallformats, sqldb, db;
const OUTPUT_FORMAT = sfExcel5;
function ExportToExcel(MiaQuery: TDataSource; MyDir: string; NomeFile: string; NomeFoglio: string; var Errore: string): boolean;
implementation
function ExportToExcel(MiaQuery: TDataSource; MyDir: string; NomeFile: string; NomeFoglio: string; var Errore: string): boolean;
var
ret: BOOLEAN;
rst: TDataSet;
MyWorkbook: TsWorkbook;
MyWorksheet: TsWorksheet;
Riga, i, Qta: integer;
begin
Errore:='';
ret:=TRUE;
try
try
rst:=MiaQuery.DataSet;
if not rst.EOF then
begin
Riga:=0;
// Create the spreadsheet
MyWorkbook := TsWorkbook.Create;
MyWorksheet := MyWorkbook.AddWorksheet(NomeFoglio);
Qta:=rst.Fields.Count;
//stampo la testata
for i:=0 to Qta-1 do
begin
if (rst.FieldDefs.Items[i].Name='') then
MyWorksheet.WriteUTF8Text(Riga, i, 'Campo' + IntToStr(i))
else
MyWorksheet.WriteUTF8Text(Riga, i, rst.FieldDefs.Items[i].Name);
MyWorksheet.WriteUsedFormatting(Riga, i, [uffBold]); //metto la cella in grassetto
end;
Inc(Riga);
//stampo i dati sul foglio excel
rst.First;
while not rst.EOF do
begin
for i:=0 to Qta-1 do
begin
if (rst.Fields[i].DataType=ftFloat) then
MyWorksheet.WriteNumber(0, 0, rst.Fields[i].AsFloat)
else if (rst.Fields[i].DataType=ftInteger) then
MyWorksheet.WriteNumber(0, 0, rst.Fields[i].AsInteger)
else if (rst.Fields[i].DataType=ftString) then
MyWorksheet.WriteUTF8Text(Riga, i, rst.Fields[i].AsString);
end;
Inc(Riga);
rst.Next;
end;
// Save the spreadsheet to a file
MyWorkbook.WriteToFile(MyDir + NomeFile + STR_EXCEL_EXTENSION, OUTPUT_FORMAT);
MyWorkbook.Free;
end
else
begin
ret:=FALSE;
end;
finally
end;
except
on E: Exception do
begin
Errore:=E.Message;
ret:=FALSE;
end;
end;
ExportToExcel:=ret;
end;
end.