Za izvoz delovnega lista Excel v PDF iz Delphi ali C++Builder brez nameščene pisarne Office pokličete SaveAsPDF na delovnem listu ali delovnem zvezku HotXLS. HotXLS je domača komponenta VCL Excel, njen izvoz delovnega lista v PDF pa upodobi uporabljeno območje lista v samostojno datoteko PDF 1.4, pri čemer preslika širine stolpcev Excela in prikazano besedilo celic na strani formata A4 s samodejnim paginiranjem na več strani. Pri upodabljanju ne sodeluje nobena kopija Excela, tiskalniški gonilnik ali zunanja knjižnica DLL
HotXLS obravnava PDF kot format za predstavitve podatkov, sorodnika svojih izvoznih poti CSV, TSV in HTML in ne ako slikovno natančen motor za upodabljanje. Izvoz poustvari tablično vsebino in postavitev: vrednosti, ki jih vidite v mreži, razmerja stolpcev in mrežne črte okoli celic. Ta okvir je pomemben, ker vnaprej postavlja pošteno pričakovanje, preostanek tega članka pa natančno opisuje, kje leži ta meja
Kako pretvoriti Excel v PDF v Delphi brez pisarne Office?
Najprej naložite delovni zvezek, nato pokličete SaveAsPDF na delovnem listu ali delovnem zvezku HotXLS. Vsaka metoda vrne Integer, 1 ob uspehu in -1 ob neuspehu, tako da se lahko vejite glede na rezultat, ne da bi klic zavili v lastno obravnavo izjem
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;
Ko pokličete SaveAsPDF na delovnem listu, HotXLS izvozi UsedRange tega lista, ki je omejevalni okvir vsake poseljene celice. Preobremenitev delovnega zvezka je priročnost, ki jo delegira aktivnemu listu, zato poročilo z več listi bodisi teče skozi zanko čez liste, ki jih potrebuje, bodisi izbere aktivni list pred klicem. Ni načina za celoten delovni zvezek, ki bi v enem prehodu združil vsak zavihek: osak klic upodobi en list ali eno območje
Kako HotXLS spremeni uporabljeno območje v strani PDF?
HotXLS prehodi uporabljeno območje celico za celico in ga razpostavi kot paginirano mrežo. Geometrija stolpcev izhaja neposredno iz Excela: vsaka širina stolpca se pretvori iz Excelove enote širine v tipografske točke, z minimalnim dnom, da se noben stolpec ne sesuje v rezino. Ko so stolpci skupaj širši od uporabne strani, jih HotXLS enakomerno pomanjša, da ustrezajo; ko že ustrezajo, jih pusti pri njihovi naravni širini in jih ne razteguje čez list
Vrstice nato tečejo navzdol po strani, dokler naslednja ne bi prečkala spodnjega roba, na kateri točki HotXLS odpre svežo stran in nadaljuje, tako da se list s tisoč vrsticami paginira sam, brez vašega vodenja prelomov strani. Vsaka celica izpiše svoj FormattedText, prikazni niz, ustvarjen po uveljavitvi formata števil, tako da se datum prikaže tako, kot ga prikazuje list, celica z valuto pa ohrani svoja ločila tisočic in simbol. Besedilo, ki presega svoj stolpec, je obrezano na širino celice, namesto da bi se prelilo k sosedu
Nadzor usmerjenosti, robov in velikosti pisave
Za vse, kar presega privzeto postavitev, neposredno upravljajte izvoznika. TXLSPDFExport je razred za enovrstičnimi pomočniki in objavlja tri lastnosti: Orientation (xlsPdfPortrait ali xlsPdfLandscape, privzeto pokončno), Margin (točke, privzeto 40) in FontSize (točke, privzeto 9). Nastavite jih, preden pokličete SaveAsPDF, in celoten dokument jih bo prevzel
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 sprejme tudi območje namesto celega lista prek SaveAsPDF(Range: IXLSRange; ...), kar je način, kako izvoziti povzetek iz lista, ki vsebuje tudi pomožne izračune. Ta preobremenitev območja je enaka tisti, na katero se interno opira pomočnik delovnega lista, zato se postavitev, skaliranje in paginacija obnašajo enako, ne glede na to, ali mu predate celotno uporabljeno območje ali ročno izbrano selekcijo
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;
Zakaj HotXLS ne vgrajuje pisave: kompromis Helvetica in WinAnsi
HotXLS zapisuje besedilo z vgrajeno pisavo Helvetica in kodiranjem WinAnsiEncoding, kar je namerna izbira brez odvisnosti z eno resno omejitvijo. Ker je Helvetica ena od standardnih 14 pisav, ki jih vsak skladen bralnik PDF že prenaša, izvoznik sploh ne vgradi programa pisave: datoteka ostane majhna in se odpre kjer koli, brez česar koli za licenciranje ali pošiljanje poleg nje. Strošek te izbire pa je nabor znakov, ki jih stran lahko prikaže
WinAnsiEncoding pokriva nabor Windows-1252, zato se latinsko besedilo, običajna ločila in običajni zahodnoevropski naglasi upodabljajo pravilno, HotXLS pa zloži peščico tipografskih znakov, kodraste narekovaje, pomišljaje en in em ter znak za evro v njihove reže CP1252. Znaki zunaj tega obsega, ideogrami CJK, cirilica, grščina in arabščina, se na strani zrušijo v vprašaj. Če vaši listi prenašajo nelatinsko besedilo, je ta izvoznik napačno orodje in delo, ki ustreza, je polno oblikovan upodabljalnik PDF
Kje se izvoz delovnega lista v PDF ustavi
HotXLS upodablja vsebino in strukturo in ne celotnega vizualnega sloga lista. Polnila celic, slogi robov na posamezen rob, pisave in barve na celico, grafikoni in vgrajene slike ležijo zunaj tistega, kar riše izvoznik; kar dobite, je mreža besedila z enotnimi mrežnimi črtami. To je enaka pogodba, ki jo spoštujeta izvoznika HTML in RTF, in je prava za poročilo ali predajo podatkov, kjer številke prenašajo pomen, tema pa ne
Ko je cilj oblikovan dokument, skladen z blagovno znamko, je običajen vzorec ta, da številke najprej sestavite v predlogi delovnega zvezka, kar podrobno obravnava potek dela za ustvarjanje poročil na podlagi predlog. In ker se nič od tega ne dotika COM-a ali delujočega primerka Excela, se cevovod ujema z enakim avtomatizacijskim modelom brez Officea, ki ga HotXLS uporablja povsod: čisti Pascal, primeren za namestitev na strežnik brez glave (headless), brez medprocesnih povezav za licenciranje ali varovanje
Samostojni PDF, bajt za bajtom
HotXLS ročno gradi strukturo datoteke PDF in izračuna svojo navzkrižno referenčno tabelo (cross-reference table) iz natančnih bajtnih odmikov, kar je razlog, da se izhod odpre v vsakem bralniku. Ko serijalizira vsak objekt, HotXLS zabeleži začetni odmik tega objekta, preden doda njegove bajte, nato pa premakne tekoči položaj za dolžino, ki jo je pravkar zapisal, tako da tabela xref pristane natančno na vsakem objektu, startxref pa označi, kje se ta tabela začne. Bralnik, ki najde te odmike le en bajt napačne, zavrne celotno datoteko, zaradi česar je samostojno izračunan odmik nosilna pogodba izvoznika
Ta pogodba prinaša eno strogo posledico, ki jo je vredno poznati. Vozlišče Pages se zapiše najprej kot objekt 1, vendar njegov seznam podrejenih strani ni znan, dokler niso oddane vse strani, zato ga HotXLS rezervira kot placeholder in vnese končne otroke ter število pred tekom odmika in nikoli pozneje. Ko so bajti objekta izmerjeni za xref, so zamrznjeni: sprememba enega samega bajta pozneje bi premaknila vsak naslednji odmik in pokvarila tabelo. To je majhna disciplina, ki kupi standardom skladen PDF 1.4 brez knjižnice pod njim
Metode SaveAsPDF in razred TXLSPDFExport, prikazani tukaj, so priloženi komponenti HotXLS Component za Delphi in C++Builder, skupaj z izvozniki za CSV, HTML in RTF ter celotnim API-jem delovnega lista