Za izvoz Excel radnog lista u PDF iz Delphija ili C++Buildera bez instaliranog Officea, pozovite SaveAsPDF na HotXLS radnom listu ili radnoj knjizi. HotXLS je VCL Excel komponenta, a njezin izvoz radnog lista u PDF prikazuje iskorišteni raspon lista u samostalnu PDF 1.4 datoteku, mapirajući Excel širine stupaca i prikazni tekst ćelija na A4 stranice s automatskim prijelomom na više stranica. U tom prikazu ne sudjeluje kopija Excela, upravljački program pisača, niti vanjski DLL
HotXLS tretira PDF kao format za prezentaciju podataka, srodan njegovim putanjama za izvoz u CSV, TSV i HTML, a ne kao pokretač za iscrtavanje točan u piksel. Izvoz reproducira tablični sadržaj i raspored: vrijednosti koje vidite u mreži, omjere stupaca i mrežne crte oko ćelija. Taj je okvir važan jer unaprijed postavlja iskrena očekivanja, a ostatak ovog članka govori o tome gdje točno leži ta granica
Kako pretvoriti Excel u PDF u Delphiju bez Officea?
Najkraći put je jedan poziv. TXLSWorksheet izlaže SaveAsPDF(FileName) i SaveAsPDF(Stream), a TXLSWorkbook izlaže ista dva preopterećenja koja se prosljeđuju na aktivni list. Svaki vraća Integer, 1 u slučaju uspjeha i -1 u slučaju neuspjeha, tako da se možete granati prema rezultatu bez umotavanja poziva u vlastito rukovanje iznimkama
uses
lxHandle;
var
Book: TXLSWorkbook;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('sales-june.xlsx');
// Render the active sheet's used range straight to report.pdf.
if Book.SaveAsPDF('report.pdf') = 1 then
Writeln('PDF written');
finally
Book.Free;
end;
end;
Kada pozovete SaveAsPDF na radnom listu, HotXLS izvozi UsedRange tog lista, granični okvir svake popunjene ćelije. Preopterećenje radne knjige je praktična metoda koja delegira na aktivni list, tako da izvješće s više listova ili prolazi kroz listove koji su mu potrebni ili odabire aktivni list prije poziva. Ne postoji način rada za cijelu radnu knjigu u jednom prolazu koji spaja sve kartice: svaki poziv prikazuje jedan list ili jedan raspon
Kako HotXLS pretvara iskorišteni raspon u PDF stranice?
HotXLS prolazi kroz iskorišteni raspon ćeliju po ćeliju i raspoređuje ga kao mrežu s prijelomom stranica. Geometrija stupaca dolazi izravno iz Excela: svaka širina stupca pretvara se iz Excelove jedinice širine u tipografske točke, uz minimalnu granicu kako se nijedan stupac ne bi pretvorio u tanku crtu. Kada su stupci zajedno širi od iskoristive stranice, HotXLS ih ravnomjerno smanjuje kako bi stali; kada već stanu, ostavlja ih u njihovoj prirodnoj širini umjesto rastezanja preko lista
Redovi zatim teku niz stranicu dok sljedeći ne bi prešao donju marginu, pri čemu HotXLS otvara novu stranicu i nastavlja, tako da se list od tisuću redova sam prelama bez vašeg vođenja računa o prijelomima stranica. Svaka ćelija ispisuje svoj FormattedText, prikazni niz nastao nakon primjene formata broja, tako da se datum prikazuje onako kako ga list prikazuje, a ćelija valute zadržava svoje separatore tisućica i simbol. Tekst koji prelazi granice stupca reže se na širinu ćelije umjesto prelijevanja u susjednu ćeliju
Upravljanje orijentacijom, marginama i veličinom fonta
Za sve što nadilazi zadani raspored, izravno upravljajte izvoznikom. TXLSPDFExport je klasa iza pomoćnika od jedne linije i objavljuje tri svojstva: Orientation (xlsPdfPortrait ili xlsPdfLandscape, okomito prema zadanim postavkama), Margin (točke, zadano 40) i FontSize (točke, zadano 9). Postavite ih prije pozivanja SaveAsPDF i cijeli dokument će ih preuzeti
uses
lxHandle, lxPDF;
var
Book: TXLSWorkbook;
Exporter: TXLSPDFExport;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('wide-ledger.xlsx');
Exporter := TXLSPDFExport.Create;
try
Exporter.Orientation := xlsPdfLandscape; // fit wide sheets on the page
Exporter.Margin := 28; // tighter page margin, in points
Exporter.FontSize := 8; // denser rows
Exporter.SaveAsPDF(Book.ActiveSheet, 'ledger.pdf');
finally
Exporter.Free;
end;
finally
Book.Free;
end;
end;
TXLSPDFExport također prihvaća raspon umjesto cijelog lista putem SaveAsPDF(Range: IXLSRange; ...), što je način na koji izvozite sažeti blok iz lista koji također sadrži privremene izračune. To preopterećenje raspona isto je ono na koje se pomoćnik radnog lista interno oslanja, pa se raspored, skaliranje i prijelom stranica ponašaju identično bez obzira na to prosljeđujete li mu puni iskorišteni raspon ili ručno odabrani dio
var
Book: TXLSWorkbook;
Exporter: TXLSPDFExport;
Summary: IXLSRange;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('quarter.xlsx');
// Export only the summary block, not the scratch columns beside it.
Summary := Book.Sheets[1].Range['A1', 'F20'];
Exporter := TXLSPDFExport.Create;
try
Exporter.SaveAsPDF(Summary, 'summary.pdf');
finally
Exporter.Free;
end;
finally
Book.Free;
end;
end;
Zašto HotXLS ne ugrađuje font: kompromis između Helvetice i WinAnsi kodiranja
HotXLS zapisuje tekst pomoću PDF-ove ugrađene Helvetice i WinAnsiEncoding kodiranja, što je namjeran izbor bez vanjskih ovisnosti, ali s jednim stvarnim ograničenjem. Budući da je Helvetica jedan od standardnih 14 fontova koje svaki usklađeni PDF čitač već sadrži, izvoznik uopće ne ugrađuje program fonta: datoteka ostaje mala i otvara se bilo gdje, bez ičega što bi trebalo licencirati ili isporučiti uz nju. Cijena tog izbora je repertoar znakova koje stranica može prikazati
WinAnsiEncoding pokriva Windows-1252 skup, pa se latinični tekst, uobičajeni znakovi interpunkcije i uobičajeni zapadnoeuropski naglasci iscrtavaju ispravno, a HotXLS preslikava nekoliko tipografskih znakova, pametne navodnike, en i em crtice te znak eura u njihova CP1252 mjesta. Znakovi izvan tog raspona, CJK ideogrami, ćirilica, grčki i arapski, pretvaraju se u upitnik na stranici. Ako vaši listovi sadrže nelatinični tekst, ovaj izvoznik je pogrešan alat i za to je prikladniji PDF renderer s punim stiliziranjem
Gdje se zaustavlja izvoz radnog lista u PDF
HotXLS prikazuje sadržaj i strukturu, a ne potpuni vizualni stil lista. Ispune ćelija, stilovi obruba pojedinih rubova, fontovi i boje po ćelijama, grafikoni i ugrađene slike nalaze se izvan onoga što izvoznik crta; ono što dobivate je tekstualna mreža s ujednačenim mrežnim crtama. To je isti ugovor koji poštuju izvoznici u HTML i RTF, i ispravan je za izvješća ili predaju podataka gdje brojevi nose značenje, a vizualna tema ne
Kada je cilj stiliziran dokument usklađen s brendom, uobičajeni obrazac je najprijestastaviti brojeve u predlošku proračunske tablice, što detaljno pokriva tijek rada za generiranje izvješća na temelju predložaka. Budući da ništa od ovoga ne koristi COM ili pokrenutu instancu Excela, cjevovod odgovara istom modelu automatizacije bez Officea koji HotXLS koristi posvuda: čisti Pascal, spreman za implementaciju na poslužitelj bez grafičkog sučelja, bez licenciranja ili brige o interoperabilnosti
Samostalni PDF, bajt po bajt
HotXLS gradi strukturu PDF datoteke ručno i izračunava njezinu tablicu unakrsnih referenci iz točnih pomaka bajtova (byte offsets), što je razlog zašto se izlaz otvara u svakom čitaču. Kako serijalizira svaki objekt, HotXLS bilježi početni pomak tog objekta prije dodavanja njegovih bajtova, a zatim pomiče tekuću poziciju za duljinu koju je upravo zapisao, tako da tablica xref slijeće točno na svaki objekt, a startxref označava gdje ta tablica počinje. Čitač koji pronađe te pomake pomaknute makar za jedan bajt odbacuje cijelu datoteku, što čini samostalno izračunati pomak ključnim ugovorom ovog izvoznika
Taj ugovor nosi jednu strogu posljedicu koju je vrijedno znati. Čvor Pages se zapisuje prvi kao objekt 1, ali njegov popis podređenih stranica nije poznat dok se ne ispiše svaka stranica, pa ga HotXLS rezervira kao rezervirano mjesto i ubacuje konačne podređene stranice i broj prije nego što se pokrene prolaz pomaka, nikada nakon toga. Nakon što se izmjere bajtovi objekta za xref, oni su zamrznuti: promjena samo jednog bajta nakon toga pomaknula bi svaki sljedeći pomak i oštetila tablicu. To je mala disciplina koja osigurava standardno valjan PDF 1.4 bez ikakve knjižnice u pozadini
Metode SaveAsPDF i klasa TXLSPDFExport prikazane ovdje isporučuju se uz HotXLS Delphi Excel Component, zajedno s izvoznicima u CSV, HTML i RTF te cijelim API-jem radnog lista za Delphi i C++Builder