Tehnički članak

Izvoz Excel radnih listova u PDF u Delphiju bez Officea

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