Otwarcie pliku Excela i zapisanie w nim danych

0

Witam,

szukam najszybszego sposobu (darmowego bez komponentów) aby utworzyć plik Excel w Delphi i zapisać w nim dane. Nie chce mi się wierzyć, że tego się nie da bez zewnętrznych komponentów. Ma ktoś na to patent? Aha i MUSI to być XLS lub XLSX w grę nie wchodzi CSV mimo, że Excel ładnie go otwiera.

0

taki baaaaaardzo stary kawałek kodu mam do tego, może Ci się przyda :

 procedure XlsWriteCellNumber(XlsStream: TStream; const ACol, ARow: Word;
  const AValue: Double);
const
 {$J+}
  CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
 {$J-}
begin

  CXlsNumber[2] := ARow;
  CXlsNumber[3] := ACol;
  XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
  XlsStream.WriteBuffer(AValue, 8);
end;


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 SaveAsExcelFile(AGrid: TJvDBUltimGrid; AFileName,Opis: 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;
  P:Pointer;

begin
  Result := False;
  FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
  try
    CXlsBof[4] := 0;
    FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
    XlsWriteCellLabel(FStream,0,0,litery(Opis,polskieznakiXLS) );

      for i := 0 to AGrid.Columns.Count - 1 do
       begin
        if Pos('_',AGrid.Columns.Items[i].FieldName)<>1 then
         XlsWriteCellLabel(FStream, i, 1, AGrid.Columns.Items[i].Title.Caption);
       end;
    AGrid.DataSource.DataSet.DisableControls;
    p:=AGrid.DataSource.DataSet.GetBookmark;
    AGrid.DataSource.DataSet.First;
    j:=2;
    while not AGrid.DataSource.DataSet.Eof do
     begin                                                       
      for i := 0 to AGrid.Columns.Count - 1 do
       if Pos('_',AGrid.Columns.Items[i].FieldName)<>1 then
        begin
          if (AGrid.Columns.Items[i].Field.DataType in [ftString,ftWideString,ftDateTime,ftDate,ftMemo]) then
            XlsWriteCellLabel(FStream, I, J, trim(AGrid.Columns.Items[i].Field.AsString) )// DataSource.DataSet.Fields[i].AsString
          else
            XlsWriteCellNumber(FStream,I,J,AGrid.Columns.Items[i].Field.AsFloat);
        end;
      inc(j);
      AGrid.DataSource.DataSet.Next;
     end;
    FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
    Result := True;
  finally
    FStream.Free;
    AGrid.DataSource.DataSet.GotoBookmark(p);
    AGrid.DataSource.DataSet.FreeBookmark(p);
    AGrid.DataSource.DataSet.EnableControls;
  end;
end;

0
Alek napisał(a):

Witam,

szukam najszybszego sposobu (darmowego bez komponentów) aby utworzyć plik Excel w Delphi i zapisać w nim dane.

Najszybszy w działaniu, czy najszybszy do napisania?
Najszybszy w działaniu jaki znam to będzie:
https://www.kluug.at/kluug-net/xlsx-ods-delphi.php

Najszybciej napiszesz za pomocą OLE, ale szybkie to to nie będzie...

Nie chce mi się wierzyć, że tego się nie da bez zewnętrznych komponentów. Ma ktoś na to patent? Aha i MUSI to być XLS lub XLSX w grę nie wchodzi CSV mimo, że Excel ładnie go otwiera.

A może Ci się nie chcieć, ale tak jest.
Patent?
Tak, kupiłem OExport i mam to "z bani".
A dodatkowo mam w tym pakiecie mega-szybki parser XMLa...
A cena, w stosunku do jakości i szybkości, jest taka, że szkoda się zastanawiać.

0
  1. przez ole - musisz mieć zainstalowanego excela, kodów od metra w google
  2. przez oledb - szczerze powiedziawszy nie wiem czy jest wymagany excel, kodów od metra w google
  3. darmowy ZEXMLSSLIB nie potrzebuje excela, obsługuje tylko nowy format (xlsx i format open/libre officea), nie wszystko działa ale są przykłady i źródła i czego nie ma można dopisać
  4. format xlsx jest otwarty i dostępny (podstawowe rzeczy wcale nie są jakieś skąplikowane) więc możesz sobie sam napisać
  5. płatne komponenty, np ten wymieniony przez @wloochacz

1 użytkowników online, w tym zalogowanych: 0, gości: 1