[Delphi]ListView to .xls, .ods, .doc

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod dyžon 8. 5. 2018 08:55

Zdravím,
tak jsem tady s dalším problémem, prosím opět o radu.
tentokrát se snažím uložit ListView do nějakého office dokumentu.
Kód: Vybrat vše
var Excel: Variant;
.....
Excel := CreateOLEObject(' ??? ');

stejně jako většina lidí nemám Microsoft Office, takže 'Excel.Application', který je ve všech příkladech použít nemůžu: (nesprávný řetězec třídy, ProgID: 'Excel.Application');
jsem schopnej zjistit cestu k programu, kterej defaultně otevírá určitou příponu,
příklad: pro xls je to 'Open Office 4\program\scalc.exe'
ale jak zjistím, co napsat pro CreateOLEObject(' ????? '); scalc.Application je blbost.
můžete mi prosím někdo poradit ??
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 8. 5. 2018 18:39

Pokud nemáš Office, pak nemůžeš ani vytvářet Ole objekt. je to jen jiný přístup k Excel.Application.
Můžeš použít CSV - to zvládne excel otevřít. Jsou to jen hodnoty oddělené středníkem (excel čárku jako oddělovač nepoužívá). 5etězce pak do uvozovek.
Můžeš si vygenerovat obyčejný TXT soubor s tabulátory (znak #9) jako oddělovači, to excel otevře taky bez problémů.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Kysa 9. 5. 2018 19:37

Pokud není potřeba složité formátování, co skusit formát sylk?
Kysa
Mírně pokročilý

Odeslat příspěvekod JanFiala 10. 5. 2018 05:57

Kysa píše:Pokud není potřeba složité formátování, co skusit formát sylk?

Sylk je už "kompilovaný" formát. Existují knihovny, které do něj zvládnou zapisovat, ale osobně bych se raději přiklonil k CSV nebo tabulátorem oddělenému plaintextu.
Zapsal ListView do CSV jsou 2 FOR cykly v sobě - přes řádky a přes sloupce. To je jen pár řádků kódu. V ListView je vše jako string, takže není třeba se trápit nějakým formátováním.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod dyžon 10. 5. 2018 07:34

díky za odpovědi.

hmmm,... Office nemám a ani nechci ...
našel jsem ovšem způsob, který vytvoří .xls ze StringGridu:
Kód: Vybrat vše
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: 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] := 1;
    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;

z LV do SG je to pohoda ...
bohužel zapisuje jen první znaky ... musím to víc prohlídnout.
chyba bude buď v:
Kód: Vybrat vše
CXlsEof: array[0..1] of Word = ($0A, 00);

nebo v té proceduře: XlsWriteCellLabel

pokud na to nepříjdu, tak to budu exportovat do .txt a hotovo ...
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod Just_jo 10. 5. 2018 14:55

Řekl bych, že CSV bude bohatě stačit.
Ten kód, který tu máš je už pár let starý ( tuším 2003 ).

Dalo by se použít něco z tohoto https://delphi.cz/post/Native-Export-XLS-bez-excel-Delphi.aspx
Případně jiné použití http://www.scip.be/index.php?Page=ComponentsExcelExport&Lang=EN
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod dyžon 11. 5. 2018 10:38

super,
díky moc, určitě na to mrknu ...
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod dyžon 14. 5. 2018 09:59

tak unita z 1. odkazu funguje pro moje účely parádně.
komponenta z 2. odkazu má i nastavení fontů a barev (nezkoušel jsem, nepotřebuji)

takže ještě jednou díky ...
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: JanFiala a 1 návštěvník