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

Tipy a triky v Delphi, díl 82. - Jak vytvořit soubor Excelu (dokončení)

Jan Šindelář - 19.3.2003

Jak vytvořit soubor Excelu (dokončení)

Pro připomenutí si řekněme, že minule jsme si ukazovali způsob využívající technologie OLE. To mělo tu výhodu, že o zápis souboru se vlastně postaral sám Excel a tím by měla být zaručena jistá správnost a korektnost tohoto postupu. Nevýhodou je to, že uživatel musí mít Excel nainstalován, protože jinak nemůže tento způsob fungovat.

Dnešním tématem je vlastně tentýž příklad jako minule, ale tentokrát si ukážeme variantu bez použití OLE. Možná tedy nebude tak "čistá" jako s využitím samotného Excelu, ale výhodou je právě to, že není nutné mít Excel nainstalován.

Na formulář umístíme stejné objekty jako minule a lišit se bude pouze samotná funkce pro zápis souboru:

procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word; const AValue: string);
var
  L: Word;
const
  {$J+}
  CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
  {$J-}
begin
  L := Length(AValue);
  CXlsLabel[1] := 8 + L;
  CXlsLabel[2] := ARow;
  CXlsLabel[3] := ACol;
  CXlsLabel[5] := L;
  XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
  XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;

function SaveAsExcelFile2(AGrid: TStringGrid; AFileName: string): Boolean;
const
  {$J+}
  CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0);
  {$J-}
  CXlsEof: array[0..1] of Word = ($0A, 00);
var
  FStream: TFileStream;
  I, J: Integer;
begin
  Result := False;
  FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
  try
    CXlsBof[4] := 0;
    FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
    for i := 0 to AGrid.ColCount - 1 do
      for j := 0 to AGrid.RowCount - 1 do
        XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]);
    FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
    Result := True;
  finally
    FStream.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if SaveAsExcelFile2(StringGrid1, `c:\Soubor.xls`) then ShowMessage(`StringGrid ulozen!`);
end;

Všimněte si drobné změny v parametrech funkce. Při porovnání s příkladem z minula zjistíte, že nám zmizel parametr pro název listu. Další výraznou změnu objevíte, pokud porovnáte při ukládání stejné tabulky výsledné velikosti souborů vytvořených příkladem z dneška a z minula. Funkce využívající OLE produkuje "pravé" XLS soubory a proto jsou v porovnání s těmi "nepravými" vytvořenými dnešní funkcí poněkud větší.

Který ze způsobů vám bude více vyhovovat nechám na vás. Osobně bych dal přeci jen přednost metodě OLE, ale pro případ, že uživatel nemá Excel by bylo vhodné obě metody zkombinovat a nebo nechat rozhodnutí přímo na uživateli vaší aplikace.