Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 81. - Jak vytvořit soubor Excelu

Jan Šindelář - 12.3.2003

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.