
Delphi - zapis do excelu xlsx
Zdravím.
Neporadíl by někdo jak něco zapsat do excel tabulky v počitači, kde excel není nainstalovan?
Jsem našel toto https://delphi.cz/post/Native-Export-XLS-bez-excel-Delphi.aspx
Je to 8 roku stare a asi to xlsx umět nebude.
Dik.
Je rozdíl, jestli chceš sešit při zápisu vytvořit nebo jej otevřít a něco modifikovat. Druhý způsob je mnohem náročnější.
Na zápis můžeš klidně použít formát CSV - je to texťák a Excel jej bez problémů otevře.
Jinak pokud chceš vytvářet přímo XLSX, pak máš víc možností. Můžeš použít databázový přístup a ADO, pokud jsou data ve formě tabulky (hlavička a data).
Pokud jde o čtení a zapisování do obecných sešitů, pak bych doporučil komerční OExport - tohle používáme v práci a funguje to dobře a rychle.
tady jsem ti našel i free knihovnu, která by to mohla zvládnout:
http://avemey.com/zexmlss/index.php
Mam xlsx soubor a v něm barevnou tabulku - jen 6 sloupcu a 5 řadku a do těch bych jen potřeboval poslat data.
Je úplně jedno, jak je tabulka velká. Pokud potřebuješ otevírat existující excel a do něj zapisovat, potřebuješ už něco robustnějšího. Těch formátů a věcí, které v rámci XLSX mohou nastat je spousta. není to jeden soubor, je to zazipovaný balík různých souborů, kde jeden obsahuje formátování, druhý data v XML atd...
Zkus si u XLSX změnit příponu na ZIP a kouknout se dovnitř.
Teoreticky, pokud potřebuješ jen zapsat data do buňek, můžeš rozzipovat soubor, zvít si z něj XML s daty, tam zapsat čísla, která potřebuješ a zase to zabalit.
A co toto?
http://www.kluug.net/xlsx-ods-delphi.php
Ak nemáš problém s licenciou a vo free verzii Ti stačí:
To mi uplně stačí.
Jsem zkusil prozbalit ten xlsx a je to nějake čudne.
V souboru sharedStrings.xml jsou všechný řetězce.
Když však mam vedle řetězcu vložene časy třeba 13:20:11 tak to nikde neni.
Kdyby to bylo vložene jako řetězec, ta by to tam bylo ale ono to je jako format bunky - čas
Zkusím kouknout na ten OExport
Časy a datum je ukládaný ve formě čísla. Musíš si v tom XML najít podle adresy příslušné buňky.
Nebo si tam napiš řetězec: čas1, čas2 atd. a uvidíš, kam se to ukládá
To je odkaz z mé první odpovědi. Tohle používáme v práci a je to bez problémů. Jen to zdarma dostaneš bez zdrojáků, pokud to nevadí...
Tak jsem zkusil ten OExport a s mou angličtinou nepochopil jak na to.
http://www.kluug.net/xlsx-ods-delphi.php
Installation.
1 je jasna Options... -> Library -> Library Path
2 Add OXml path to your library. The path is: {INSTALLATION DIRECTORY}\OXml\utils\
Žadný adresař \OXml\utils\ jsem ve staženem baliku nenašel.
I tak mi ale ty dema fungují, ale vždý při spuštění mi vyskočí hlaška - okno s infem, že to je demo.
Jak na to aby to bylo bez te hlašky?
Ale našel jsem toto http://www.scip.be/index.php?Page=ComponentsExcelExport&Lang=EN
freeware for non-commercial use
Ale
his ExcelExport component uses the Office server components from the Borland/CodeGear/Embarcadero COM type library to implement OLE automation.
Pochopil jsem to spravně, že v počitači musí být nainstalovaný excel?
Ano, pokud něco funguje přes Ole Automation, pak to používá OLE objekt Excelu.
Co se týká OExport, potřebuješ obě knihovny - OXML a OExport. Stáhni si obě a zkus to znovu.
Příklad použití OExport
Děkují moc za ochotu, ale jsem nějak natvrdlej
Stahují soubor oexport-free-2-29--2019-01-07.zip
Kde stahnu ty 2 knihovny?
Uplně dole je Compiled applications without source code a soubor inspectxmlzip--2012-03-16.zip
V něm však je exe nspectXMLZIP.exe
Stáhni si i OXML. K exportu potřebuješ OXML i OExport
Děkují mooooc, funguje
Moh bych ještě jeden dotaz mimo téma?
Pomaham s tým kamošoví, mi by asi na mem notasu delphi nestihalo, jsem rad že to zvlada lazarus.
Když ma v delphi info Embarcadero® Delphi 10 Seattle Version, to je DX10 ?
Ono se možna nejedna o warez.
Kamošuv tatik ma firmu a tam měli programatora, který nedavno odešel.
V počitači jsme našli par komponet.
Nikdo netuší, kde je sehnal a jestli nejsou kupovane na tatikovou firmu, když je tam nechal, nebo je někde nelegalně sehnal.
Je tam i AlphaControls 12.14 Stable a nějak se mu to nedaří nainstalovat.
http://img24.cz/images/32493360928033838836.png
Podle mně by to mělo být DX10_x64, jelikož ma delphi naintalovane na win 10 64 bit?
Verze šly postupně:
Seattle (10), Berlin (10.1), Tokyo (10.2), RIO (10.3)
Delphi 10 v zakladu generuje 32b aplikace, 64b compiler je volitelný při instalaci. Stejně tak jako MAC, Adnroid atd.
A dokonce ani 64b verzi nemusíš kompilovat na 64b verzi Windows, ale můžeš i na 32b. Jen to pak nespustíš.
Ty složky jsou tam proto, protože uvádíš cestu ke zdrojům (library path) pro 32b a 64b verzi zvlášť, pokud se liší - typicky, pokud máš komponenty bez plných zdrojů a některé věci jsou předkompilované
Pro Seatle bych bral složky DX10 a DX10_64
Co konkrétně ti nejde nainstalovat? Co to hlásí?
Obvykle je třeba přidat cestu ke zdrojům do LibraryPath pro příslušný kompiler
Pak se otevře projekt a zkompilují se balíčky. Cesta k balíčkům (BPL) pak musí být v Path proměnné počítače. Balíčky jsou runtine a designtime (ty obsahují vizuální komponenty)
Děkují moc, zitra rano se ozvu.
Pracují - odpolední
Tak jsem zkusil ten adresař DX10 a vypadalo to že se povedlo.
Mam to v C:\Users\Public\Delphi\AlphaControls-12.14-Stable
Do Library Path C:\Users\Public\Delphi\AlphaControls-12.14-Stable
Options -> Library v Selected platform mam 32 bit windows, tak jsem tedy zvolil adresř DX10.
Compile ok.
install ok.
Nový projekt - 32 bit windows - a je to tam.
Hups na Form sSkinManager1.
sSkinManager1 - Object Inspektor - SkinDirectory - C:\Users\Public\Delphi\AlphaControls-12.14-Stable\Skins
sSkinManager1 - Object Inspektor - SkinName - vyberu skin
Run
C:\Users\Public\Delphi\AlphaControls-12.14-Stable -V -VN -NBC:\Users\Public\Documents\Embarcadero\Studio\17.0\Dcp
-NHC:\Users\Public\Documents\Embarcadero\Studio\17.0\hpp\Win32 -NO.\Win32\Debug Project1.dpr
[dcc32 Fatal Error] Unit1.pas(7): F2613 Unit 'sSkinManager' not found.
Failed
Musis do Library Path dat vsechny slozky se zdroji. Pokud je unita sSkinManager nekde jinde, tak tam tu slozku pridej
Tak se pobedlo. U te komponenty je i instal text a vubec tam nepišou že se musí ještě skompilovat AlphaDB
Ale dnes jsem u kamoše a zjistil jsem že s OExport asi udělal někde kopanec.
Ono to funguje ale při spuštění programu vždy vyskoči toto.
http://img24.cz/images/77453253871827434785.png
Na kluug.net v sekcí download je postu.
1.) Add OExport path to your library - please mind your Delphi version!
For Delphi XE4 32bit, the path is:
{INSTALLATION DIRECTORY}\OExport\DelphiXE4\Win32\
d:\OExport\OExport\Delphi10\Win32\
2.) Add OXml path to your library.
The path is: {INSTALLATION DIRECTORY}\OXml\utils\
d:\OExport\OXml-trial\units\
Co je špatně?
Nevím, já mám plnou verzi.
Nezkoušel jsi se zeptat přímo autora? Ońdřej je Čech.
Stahnul jsem si OExport. Podle mne jsou tam vsechny unity, ktere potrebujes i z OXML. Takze odeber z library path vse, co jsi daval do samostatne stazene OXML. Cestu do OXML\Utils taky nepotrebujes, protože všechny unity jsou zkompilovane ve složce Win32
Ano, ono to jde spustit, ale ta placka co vyskočí o tom demu je dost nepřijemna
Kamoš mu psal e-mail.
nikde jste chybu neudělali. Je to součástí demoverze.
A? Když ti to vadí, tak si kup plnou verzi nebo naprogramuj svoji vlastní komponentu.
Zkoušel jste někdy timto zpusobem něco upravit?
Přejmenují na zip a rozbalim do složky, vubec do toho nevlezu.
Zabalim to zpatky do zip a přejmenují na puvodní Sešit1.xlsx
Excel to pozna a neotevře
Zkoušel.
Tímto způsobem jsem odemykal zamknuté (ne zašifrované) Excely pro úpravy - podstrčil jsem do ZIP jiný soubor.
Zkoušel jsem to teď. Pokud soubor vytáhnu, nahradím a vrátím zpět (necham zip, jak je), tak to projde.
Pokud ZIP rozbalim a pak znovu zabalim, pak to neprojde - neznám parametry. To znamená, že musíš ZIP zabalit se stejnými parametry (typ komprese atd.) jako původní
P.S.
Tak se mi podařilo zavalit i rozbaleny XLSX
Použil jsem 7Zip, jako metoda ZIP, fastest, deflate
Jen nesmíš do archivu zabalit i nadřízenou složku
Pokud si s tím chceš hrát, tak řetězce najdeš v souboru:
\xl\sharedStrings.xml
a data pak v souboru (zalezi, na jménu listu):
\xl\worksheets\sheets1.xml
Jsem zkusil dat na bunky A1,A2,A3,A4 format čas 13:30 a do každe vložil 13:32
xl\worksheets\sheet1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac xr xr2 xr3" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" xr:uid="{A4B63BA3-17F1-49FE-BE14-4E0312EA7073}"><dimension ref="A1:B2"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection activeCell="B2" sqref="B2"/></sheetView></sheetViews><sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/><sheetData><row r="1" spans="1:2" x14ac:dyDescent="0.25"><c r="A1" s="1"><v>0.56388888888888888</v></c><c r="B1" s="1"><v>0.56388888888888888</v></c></row><row r="2" spans="1:2" x14ac:dyDescent="0.25"><c r="A2" s="1"><v>0.56388888888888888</v></c><c r="B2" s="1"><v>0.56388888888888888</v></c></row></sheetData><pageMargins left="0.7" right="0.7" top="0.78740157499999996" bottom="0.78740157499999996" header="0.3" footer="0.3"/></worksheet>
Nějake čudne to je, nikde těch 13:32 nevidím
Ale vidíš, jenže v jiné podobě: 0.56388888888888888.
Formát data a času (hh:mm) je pouze vnější reprezentace. Schválně - zkopíruj si to číslo do buňky a změň její formát na hh:mm - už chápeš? Prostuduj si třeba tohle.
Chce to číst odpovědi a pokud je i čteš, tak si je pamatovat.
Psal jsem, že datum a čas je v Excelu zapsán číslem, ne jako řetězec.
No a když mám v delphi čas jeko řetšzec, jak ho převedu na to číslo?
13:32:00 = 0.56388888888888888
Nemáš chuť sa trošinku zdokonaliť vo svojich vedomostiach aj sám?
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Date_and_Time_Support
Datum je ulozen jako číslo před desetinnou čárkou a začíná datem 0.1.1900. Takže 1.1.1900 = 1
Čas je uložen jako desetinná část čísla a znamená část dne (24h). Takže 6:00 = 0.25
Protože Delphi používá stejný systém, neměl bys mít problém to jednoduše převést. V Delphi je TDateTime typu double, takže stačí zapsat číslo, jak máš:
ExcelCislo := Double(DelphiDatum);