Často je potřeba data z našich aplikací uložit do takového formátu, aby šla zpracovávat i v jiných aplikacích. Dnes si ukážeme, jak vytvořit soubor Excelu.
Jako zdroj dat nám poslouží komponenta
StringGrid, která celkem věrně připomíná tabulku Excelu, takže export dat právě z této komponenty bude asi nejčastější a nejpoužívanější. Proto vložte na formulář právě tuto komponentu a její vzhled si klidně upravte dle libosti, na něm nezáleží.
Tabulku je samozřejmě nutné naplnit daty, jinak nemá celkem smysl ji nikam exportovat. V buňkách mohou být uloženy nejen přímo hodnoty či texty, ale rovněž vzorce či přímo funkce, které Excel obsahuje. V samotné komponentě StringGrid pochopitelně výsledky výpočtů funkcí neuvidíte, ale po vyexportování tabulky do souboru XLS a otevření v Excelu bude vše fungovat. Pokud jste ovšem neudělali chybu v zápisu funkce.
A dostáváme se k hlavní části programu a sice k samotnému uložení dat do XLS souboru. To lze provést jako obvykle několika způsoby. První z nich využívá technologii OLE, kterou snad nemusím zbytečně popisovat a k fungování našeho příkladu tím pádem bude nutné mít Excel v počítači nainstalován. To je bohužel drobná vada na kráse tohoto způsobu, ale na druhou stranu lze zase předpokládat, že uživatel, který bude chtít z vaší aplikace data vyexportovat právě do Excelu, jej má i nainstalován. Zároveň je zde jistá záruka správnosti výsledného souboru, když jej vlastně vytváří sám Excel. Příště si ukážeme i variantu exportu dat, ke které nebude Excel potřeba.
Ale to až příště, teď zpět k našemu zdrojovému kódu. Jako obvykle se bude skládat z hlavní funkce (a jedné pomocné) a dále ukázky použití v podobě události stisku tlačítka. Poslední nutnou věcí je knihovna ComObj, kterou přidejte do seznamu.
function RefToCell(ARow, ACol: Integer): string;
begin
Result := Chr(Ord(`A`) + ACol - 1) + IntToStr(ARow);
end;
function SaveAsExcelFile(AGrid: TStringGrid; const ASheetName, AFileName: string): Boolean;
const
xlWBATWorksheet = -4167;
var
Row, Col: Integer;
GridPrevFile: string;
XLApp, Sheet, Data: OLEVariant;
i, j: Integer;
begin
Data := VarArrayCreate([1, AGrid.RowCount, 1, AGrid.ColCount], varVariant);
for i := 0 to AGrid.ColCount - 1 do
for j := 0 to AGrid.RowCount - 1 do
Data[j + 1, i + 1] := AGrid.Cells[i, j];
Result := False;
XLApp := CreateOleObject(`Excel.Application`);
try
XLApp.Visible := False;
XLApp.Workbooks.Add(xlWBatWorkSheet);
Sheet := XLApp.Workbooks[1].WorkSheets[1];
Sheet.Name := ASheetName;
Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount, AGrid.ColCount)].Value := Data;
try
XLApp.Workbooks[1].SaveAs(AFileName);
Result := True;
except
ShowMessage(`Chyba pri ukladani dat!`)
end;
finally
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if SaveAsExcelFile(StringGrid1, `Nazev listu`, `c:\Soubor.xls`) then ShowMessage(`StringGrid ulozen!`);
end;
Parametry funkce jsou myslím dostatečně jasné. Prvním z nich je StringGrid, který chceme uložit. Druhý parametr je název listu, který bude vytvořen v sešitu Excelu. Třetím parametrem není nic jiného než název vyexportovaného souboru.
A to je pro dnešek vše. Příště si tedy zkusíme podobný příklad, ale tentokrát už bez Excelu.