Autor Téma: Exportovat data z více dbgrid do jednoho excelu na více sešitů  (Přečteno 702 krát)

Offline Krpik

  • Nováček
  • *
  • Příspěvků: 2
  • Karma: 0
    • Verze Delphi: Delphi 7
Zravím,
Mam aplikaci , která mě načítá vyselektované data z databáze do tabulky a dále exportuje do excelu
Program má více button , které projedou select vyčtou data a vyexportují
Problém je , že mám potom několik souborů a já bych potřeboval aby aplikace měla pouze jeden Button, který mě projede dotazy(selecty) vytáhne hodnoty a vyexportuje do jednoho excelového souboru, Aplikace by měla vytvořit v excelu více sešitu kde najdu ty hodnoty.
Mam tedy 5 Button tlačítek a tedy nyní 5x excel soubor vyexportovaný a potřeboval bych abych měl jeden excel soubor a v něm tedy 5 sešitů

Kod zde od jednoho Button tlačítka, Ostatní jsou podobně jen z jiným Selectem
Kód: Delphi [Vybrat]
  1. var
  2.   i,ColNum: Integer;
  3.   Title,Data,SaveName: String;
  4.   ALst: TStringList;
  5.  
  6. begin
  7.  with adoQuery2 do
  8.  with adoQuery1 do
  9.  
  10.  
  11.     begin
  12.       if active then close;
  13.       SQL.clear;
  14.  
  15.  
  16.   adoQuery1.SQL.text := 'select datum,  sum(hotnoty1), sum(hodnoty2) from tabulka1 GROUP BY DATE_FORMAT (datum,"%d%m%y") ;';
  17.          adoQuery1.Active := True;
  18.    
  19.       try
  20.     ALst:=TStringList.Create;
  21.     ALst.Clear;
  22.  
  23.     ColNum:=0;
  24.     ColNum:=dbGrid1.Columns.Count-1;
  25.  
  26.     Title:='';
  27.     Title:=';'+dbGrid1.Columns.Items[0].Title.Caption+';';
  28.     for i := 1 to dbGrid1.Columns.Count-1 do
  29.     begin
  30.       Title:=Title+';'+dbGrid1.Columns.Items[i].Title.Caption+';';
  31.     end;
  32.     ALst.Add(Title);
  33.  
  34.     with adoQuery1 do
  35.     begin
  36.       First;
  37.       while not Eof do
  38.       begin
  39.         Data:=';'+FieldByName(dbGrid1.Columns.Items[0].FieldName).AsString+';';
  40.         for i := 1 to ColNum do
  41.         begin
  42.           Data:=Data+';'+FieldByName(dbGrid1.Columns.Items[i].FieldName).AsString+';';
  43.         end;
  44.         ALst.Add(Data);
  45.         Next;
  46.       end;
  47.     end;
  48.      createdir ('c:\EXPORT');
  49.     SaveName:=FormatDateTime('DD-MM-yyyy ',Now);
  50.     SaveName:='C:\export\'+SaveName+ 'Data 1''.csv';
  51.     ALst.SaveToFile(SaveName);
  52.   finally
  53.     ALst.Free;
  54.   end;
  55.   Application.MessageBox(PChar('uloženo '+SaveName),'export',64);
  56.  
  57. end;
  58.  
  59.    end;
  60. procedure TForm1.FormCreate(Sender: TObject);
  61. begin
  62.      DataSource1.DataSet := adoQuery1 ;
  63.  
  64.        DBGrid1.DataSource := DataSource1;
  65.  
  66.   end;
  67.  
děkuji za radu

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1052
  • Karma: 47
    • Verze Delphi: 10.3
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #1 kdy: 13-12-2019, 10:20:33 »
Ahoj,

tohle není export do Excelu, ale do .csv.
.csv nepodporuje více listů.

K.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 585
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #2 kdy: 13-12-2019, 12:21:27 »
V kóde príspevku vidím ADO. Takže sa dá ľahko spraviť ozajstný export do Excelu. Len na báze úpravy SQL príkazu:
ADO podporuje priamy export dát do excelu:
Kód: MySQL [Vybrat]
  1. SELECT * INTO [Excel 12.0 xml;Database=c:\test.xlsx;].[$Harok2] from mojaAccessTabulka
do sheetu: Harok2
alebo
Kód: MySQL [Vybrat]
  1. SELECT * INTO [Excel 12.0 xml;Database=c:\test.xlsx;].[PomenovanaOblast] from mojaAccessTabulka
do NamedRange
Ani Sheet ani NamedRange nemusí vopred existovať. Ba ani súbor.
Naopak súbor môže existovať, ale nie cieľový hárok, alebo cieľová tabuľka

Import z Excelu do Accessu (*.accdb format):
Kód: MySQL [Vybrat]
  1. SELECT * INTO mojaAccessTabulka FROM [Excel 12.0;Database=c:\test.xlsx;].[$Harok1]
ADO podporuje priamy export dát do excelu:

Samozrejme sa dáta dajú aj prezerať. Ak sa nepoužije INTO .. niekam..

Pre export/Import CSV funguje s podobnou syntaxou.

Funguje dokonca aj EXCEL <==> CSV/Text:
Kód: MySQL [Vybrat]
  1. SELECT * INTO [Excel 12.0 xml;Database=c:\test.xls;].[Tab_Txt]  FROM ['Text;Database=C:\;HDR=Yes;Format=Delimited(;);'].[test.txt]

PS:
Malo by to fungovať aj priamo ako Query v MS Access. Teda nielen z kódu (Delphi)
« Poslední změna: 13-12-2019, 12:38:34 od miroB »

Offline Krpik

  • Nováček
  • *
  • Příspěvků: 2
  • Karma: 0
    • Verze Delphi: Delphi 7
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #3 kdy: 14-12-2019, 00:49:47 »
tohle  ně chtěl bych to dělat vše v delphi

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1052
  • Karma: 47
    • Verze Delphi: 10.3
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #4 kdy: 14-12-2019, 09:30:29 »
Tak zkus googlit: Delphi CreateOleObject('Excel.Application')

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5261
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #5 kdy: 14-12-2019, 09:30:59 »
Neviem ako Ty, ale ja tam od miroB vidím odpoveď pre riešenie v Delphi.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 585
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #6 kdy: 14-12-2019, 09:55:23 »
Neviem ako Ty, ale ja tam od miroB vidím odpoveď pre riešenie v Delphi.
Díky Stano.
Nič jednoduchšie už neexistuje.
Samozrejme, že je to v Delphi. Stačí to vložiť do TADOQuery.
Asi tak, ako v originánom kóde:
Kód: Delphi [Vybrat]
  1. adoQuery1.SQL.text:= ..

Offline miroB

  • Guru
  • *****
  • Příspěvků: 585
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #7 kdy: 14-12-2019, 09:59:31 »
tohle  ně chtěl bych to dělat vše v delphi
Uvažoval si vôbec nad svojou odpoveďou? Kde tam nie je Delphi?
Práca s Query (ADOQuery) a s textom => SQL jazyk a ADO, veď to evidentne používaš.
Prípadne neskôr ODBC, FireDAC a iné.
Samozrejme, že ten obsah hranatých zátvoriek je z hľadiska SQL neštandardný.
Ale chvalabohu za to, že tu Microsoft pridal príjemnú nadstavbu k SQL.
Čo som uviedol vyššie, je vychytávka, ktorú len málo ľudí pozná.
Ani na webe sa nedá celkom ľahko nájsť.
Zrejme si všetci myslia, že tak niečo jednoduché, nemôže fungovať. Ale funguje.
Tak sa prosím zamysli znovu a daj vedieť.

A ak potrebuješ z naplneného datasetu/Query, (to sprostredkuje môj príspevok vyššie), vyrobiť CSV, tak to stále môžeš presne po svojom.
Vyššie som uviedol, ako to docieliť priamo pomocou vhodného SQL.
Každý SQL môže byť v Delphi.
« Poslední změna: 14-12-2019, 10:11:52 od miroB »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 585
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #8 kdy: 14-12-2019, 10:19:11 »
Tak zkus googlit: Delphi CreateOleObject('Excel.Application')
O tomto niečo viem.
Ak to má dobre fungovať, treba využívať Early Binding.
Late Binding je:
  • výrazne pomalší
  • nemá jasné objekty, lebo sa pracuje cez Variant. Preto je tam jediná cesta : ísť presne podľa vzorov. Inak také programovanie nemá konca kraja. Len aby tie vzory presne pasovali..
  • Ak tak najviac sa dá nájsť riešení pre VBA. To by mohlo byť cesta. Preklopiť si príklady do Delphi
Na druhej strane Early Binding nie je zrovna rýchla cesta pre nováčikov.
Treba mať knižnicu Excel_tlb.pas.
Potom sa dá pekne pracovať, len je to na dlho. Žiadne krátke riešenie. Treba sa doučiť rôzne techniky.

« Poslední změna: 14-12-2019, 10:23:17 od miroB »

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1052
  • Karma: 47
    • Verze Delphi: 10.3
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #9 kdy: 14-12-2019, 10:21:19 »
Tak zkus googlit: Delphi CreateOleObject('Excel.Application')
O tomto niečo viem.
Ak to má dobre fungovať, treba využívať Early Binding.
Late Binding je:
- výrazne pomalší
- nemá jasné objekty, lebo sa pracuje cez Variant. Preto je tam jediná cesta : ísť presne podľa vzorov. Inak také programovanie nemá konca kraja. Len aby tie vzory presne pasovali..
Na druhej strane Early Binding nie je zrovna rýchla cesta pre nováčikov.

Máme takhle udělané exporty a fungují rychle. Hodně rychle :-) Základem té rychlosti ale je nezapisovat po jednotlivých buňkách, ale po celých oblastech (nebo alespoň po řádcích).

Offline miroB

  • Guru
  • *****
  • Příspěvků: 585
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #10 kdy: 14-12-2019, 10:29:14 »
Tak zkus googlit: Delphi CreateOleObject('Excel.Application')
O tomto niečo viem.
Ak to má dobre fungovať, treba využívať Early Binding.
Late Binding je:
- výrazne pomalší
- nemá jasné objekty, lebo sa pracuje cez Variant. Preto je tam jediná cesta : ísť presne podľa vzorov. Inak také programovanie nemá konca kraja. Len aby tie vzory presne pasovali..
Na druhej strane Early Binding nie je zrovna rýchla cesta pre nováčikov.

Máme takhle udělané exporty a fungují rychle. Hodně rychle :-) Základem té rychlosti ale je nezapisovat po jednotlivých buňkách, ale po celých oblastech (nebo alespoň po řádcích).
Otázka, čo je hodne.
Inak ak by šlo o Access, tak ten môj návod zhora je suverénne najrýchlejší a najpohodlnejší.

Pri tom Excel.Application veľmi záleží od veľkosti tabuľky.
Výhra je jedine keď celú tabuľku vezmeme naraz do pamäti.
Pracujem aj s tabuľkami na hranici 1 mil riadkov a tam by už boli rozdiely obrovské.
Tiež robím veľa interaktívnej spolupráce s excelom. S late binding by to bolo veľmi obmedzujúce.

Primárne však na import/export z excelu už nepoužívam excel, ale tie xml-y z ktorých je vyskladaný.
Jediná výnimka je, pri spolupraci s Excelom, ktorý je aktuálne otvorený. Vtedy, keď nemá aktuálne dáta uložené na disku. Za takých okoľností je to jediná možnosť. Aj tu je však Early binding vo veľkej výhode.
« Poslední změna: 14-12-2019, 10:41:18 od miroB »

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1052
  • Karma: 47
    • Verze Delphi: 10.3
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #11 kdy: 14-12-2019, 10:37:48 »
Otázka, čo je hodne. Záleží tiež od veľkosti tabuľky. Výhra je jedine keď celú tabuľku vezmeme naraz do pamäti.
Osobne pracujem aj s tabuľkami na hranici 1 mil riadkov a tam by už boli rozdiely obrovské.

Používáme to pro podobně velké exporty, některé už se daly dokončit jen s 64bitovým Excelem, jinak Excelu nestačila paměť.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 585
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #12 kdy: 14-12-2019, 10:42:47 »
Otázka, čo je hodne. Záleží tiež od veľkosti tabuľky. Výhra je jedine keď celú tabuľku vezmeme naraz do pamäti.
Osobne pracujem aj s tabuľkami na hranici 1 mil riadkov a tam by už boli rozdiely obrovské.

Používáme to pro podobně velké exporty, některé už se daly dokončit jen s 64bitovým Excelem, jinak Excelu nestačila paměť.
A to ste robili late binding?
Druhá vec, čo je rýchly, hovoríme o
  • minútach?
  • desiatkach sekúnd?
  • pár sekundách?
Za mňa:
  • od OLE som odišiel pred cca 4-rokmi. Okrem špecifických a nevyhnutných prípadov
  • Access vo forme uvedenej vyššie som opustil asi 2 roky dozadu. Kvôli problémom viacerým s Accessom
  • Pre export z Excelu mám vlastný nástroj. Neverím, že by mal niekto niečo rýchlejšie. Ani v Delphi a zrejme ani inak
Priznávam, že OLE môže uspokojivo fungovať.
Len nie pre moje potreby.
Predpokladám, že aj pre pôvodného autora tohoto dotazu je omnoho jednoduchší postup, ktorý som poslal v úvode.
« Poslední změna: 14-12-2019, 11:02:33 od miroB »

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1052
  • Karma: 47
    • Verze Delphi: 10.3
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #13 kdy: 14-12-2019, 11:02:21 »
A to ste robili late binding?
Druhá vec, niekde sa považujú minuty za rýchlosť, inde 10 sekúnd a inde pod 1 sekundu.
Teraz neviem kde sa presne pohybujeme.

Možná jsem se v tom prvním příspěvku ohledně rychlosti chlubil víc, než by odpovídalo situaci :-) Co jsem měl info od uživatele, výsledný excelový soubor měl necelé 3 GB (pouštěli to na PC s 16 GB RAM a 64bitovým Excelem). Příprava dat v naší aplikaci (stažení z databáze a nějaké výpočty) byla lehce přes dvě minuty, předání do Excelu kolem 4 minut (data a trocha formátování, 11 listů). Data pak načítali do nějaké další aplikace, načítání trvalo přes dvě a půl hodiny... Asi proto jsem byl s tou rychlostí tak spokojený.

Early binding jsem se bál použít, protože jsem nevěděl, jestli by to bylo bez potíží s různými verzemi Excelu (od 2003 do nějaké té +- aktuální) - mám dojem, že kdysi ještě v Delphi 5 jsem měl v jiné aplikaci použitý early binding a pak jsem to kvůli nějakému novějšímu Excelu měnil.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 585
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Exportovat data z více dbgrid do jednoho excelu na více sešitů
« Odpověď #14 kdy: 14-12-2019, 11:08:21 »
..
Early binding jsem se bál použít, protože jsem nevěděl, jestli by to bylo bez potíží s různými verzemi Excelu (od 2003 do nějaké té +- aktuální) - mám dojem, že kdysi ještě v Delphi 5 jsem měl v jiné aplikaci použitý early binding a pak jsem to kvůli nějakému novějšímu Excelu měnil.
Early binding mi nerobil problém najmenej 10 rokov používania dozadu.
Presnejšie som s ním pracoval od Office 97. Niečo sa mi marí o drobných problémoch, ale posledné desaťročie si nespomínam.
To problémy s Accessom, resp s jeho enginou boli neskutočné. Pri každom novom Office.

K rýchlosti:
  • som presvedčený, že EB by pri väčších dátach spravila násobky voči LB. Pri formátovaní až 10násobky
  • môj aktuálny tool by mal byť aspoň 100-x rýchlejší
« Poslední změna: 14-12-2019, 11:11:47 od miroB »