For å eksportere et Excel-regneark til PDF fra Delphi eller C++Builder uten Office installert, kaller du SaveAsPDF på et HotXLS-regneark eller en -arbeidsbok. HotXLS er en innfødt VCL Excel-komponent, og dens eksport fra regneark til PDF rendrer arkets brukte område (UsedRange) til en frittstående PDF 1.4-fil. Den kartlegger Excels kolonnebredder og cellenes visningstekst over på A4-sider med automatisk sideinndeling over flere sider. Ingen kopi av Excel, ingen skriverdriver, og ingen ekstern DLL tar del i rendringen
HotXLS behandler PDF som et datapresentasjonsformat, en søsken av sine CSV-, TSV- og HTML-eksportbaner, snarere enn en pikselnøyaktig rendringsmotor. Eksporten gjenskaper tabellinnhold og layout: verdiene du ser i rutenettet, kolonneforholdene, og rutenettlinjene rundt cellene. Denne rammen er viktig fordi den setter en ærlig forventning på forhånd, og resten av denne artikkelen handler om akkurat hvor grensen går
Hvordan konverterer du Excel til PDF i Delphi uten Office?
Den korteste veien er et enkelt kall. TXLSWorksheet eksponerer SaveAsPDF(FileName) og SaveAsPDF(Stream), og TXLSWorkbook eksponerer de samme to overlastede metodene (overloads) som videresender kallet til det aktive arket. Hver av dem returnerer en Integer, 1 ved suksess og -1 ved feil, slik at du kan styre programflyten basert på resultatet uten å pakke kallet inn i din egen unntakshåndtering
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;
Når du kaller SaveAsPDF på et regneark, HotXLS eksporterer det arkets UsedRange, som er avgrensningsboksen til hver utfylte celle. Arbeidsbok-overloaden er en bekvemmelighet som delegerer til det aktive arket, så en rapport med flere ark enten går i løkke over arkene den trenger eller velger det aktive arket før kallet. Det finnes ingen hel arbeidsbok, alt-i-en-omgang-modus som slår sammen hver fane: hvert kall rendrer ett ark eller ett område
Radene flyter deretter nedover siden til den neste vil krysse bunnmargen. På det tidspunktet åpner HotXLS en ny side og fortsetter, slik at et ark med tusen rader pagineres automatisk uten at du trenger å holde styr på sideskift. Hver celle skriver ut sin FormattedText, som er visningsstrengen som produseres etter at tallformatet er brukt. Dermed vises en dato slik arket viser den, og en valutacelle beholder sine tusenskilletegn og valutasymbol. Tekst som overskrider kolonnen sin, klippes til cellebredden i stedet for å flyte over i nabocellen
Kontrollere retning, marger og skriftstørrelse
For alt som går utover standardoppsettet, styrer du eksportøren direkte. TXLSPDFExport er klassen bak enlinjes-hjelperne, og den publiserer tre egenskaper: Orientation (xlsPdfPortrait eller xlsPdfLandscape, stående retning som standard), Margin (punkter, standard 40) og FontSize (punkter, standard 9). Sett disse før du kaller SaveAsPDF, så vil hele dokumentet bruke dem
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 godtar også et område i stedet for et helt ark via SaveAsPDF(Range: IXLSRange; ...), som er måten du eksporterer en oppsummeringsblokk ut av et ark som også inneholder kladdberegninger. Den område-overloaden er den samme som regnearkhjelperen lener seg på internt, så oppsettet, skaleringen og pagineringen fungerer identisk enten du overleverer et fullt brukt område eller et håndplukket utvalg
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;
Hvorfor HotXLS ikke bygger inn skrifttyper: Helvetica- og WinAnsi-avveiningen
HotXLS skriver teksten med PDFs innebygde Helvetica og WinAnsiEncoding, et bevisst valg for null avhengigheter, men med én reell begrensning. Siden Helvetica er en av de 14 standard skrifttypene som enhver kompatibel PDF-leser allerede har, bygger ikke eksportøren inn noe skrifttypeprogram i det hele tatt: filen forblir liten og kan åpnes overalt, uten at noe må lisensieres eller leveres ved siden av den. Prisen for det valget er repertoaret av tegn siden kan vise
WinAnsiEncoding dekker Windows-1252-settet, slik at latinsk tekst, vanlig tegnsetting og de vanlige vesteuropeiske aksentene rendres riktig, og HotXLS tilpasser en håndfull typografiske tegn, krøllete anførselstegn, tankestreker (en- og em-dashes) og euro-symbolet inn i deres CP1252-plasser. Tegn utenfor dette området, som CJK-ideogrammer, kyrillisk, gresk og arabisk, kollapser to et spørsmålstegn på siden. Hvis arkene dine inneholder ikke-latinsk tekst, er denne eksportøren feil verktøy, og en PDF-rendrer med full formatering er løsningen som passer
Hvor eksporten fra regneark til PDF stopper
HotXLS rendrer innhold og struktur, not den arkets fulle visuelle stil. Cellefyll, kantlinjestiler per kant, skrifttyper og farger per celle, diagrammer og innebygde bilder ligger utenfor det eksportøren tegner; det du får, er tekst-rutenettet med enhetlige rutenettlinjer. Dette er den samme kontrakten som HTML- og RTF-eksportørene overholder, og det er den riktige for en rapport eller en dataoverføring der tallene bærer meningen og utseendet (themet) ikke gjør det
Når målet er et formatert, merkevare-konsistent dokument, er det vanlige mønsteret å samle tallene i en regnearkmal først, noe den mal-drevne rapportgenereringsarbeidsflyten dekker i dybden. Og fordi ingenting av dette berører COM eller en kjørende Excel-instans, prosessen passer inn i den samme Office-frie automatiseringsmodellen som HotXLS bruker overalt: ren Pascal, klar for distribusjon på en hodeløs (headless) server, uten noen interop som må lisensieres eller passes på
Den frittstående PDF-en, byte for byte
HotXLS bygger PDF-filstrukturen for hånd og beregner krysreferansetabellen (cross-reference table) ut fra nøyaktige byte-offsetter. Dette er grunnen til at utdataene kan åpnes i enhver leser. Etter hvert som den serialiserer hvert objekt, HotXLS registrerer dette objektets start-offset før byte-sekvensen legges til. Deretter flyttes den gjeldende posisjonen fremover med lengden den akkurat skrev, slik at xref-tabellen lander nøyaktig på hvert objekt, og startxref markerer hvor den tabellen begynner. En leser som finner disse offsettene bare én byte feil, vil avvise hele filen, noe som gjør den selvberegnede offsetten til eksportørens bærende kontrakt
Den kontrakten medfører en streng konsekvens som er verdt å kjenne til. Pages-noden skrives først som objekt 1, men listen over underordnede sider er ikke kjent før hver side er sendt ut. Derfor reserverer HotXLS den som en plassholder og setter inn de endelige underordnede sidene (kids) og antallet før offset-gjennomgangen kjører, aldri etterpå. Når et objekts byte først er målt for xref-tabellen, fryses de: å endre en enkelt byte etterpå ville forskyve hver påfølgende offset og ødelegge tabellen. Det er en liten disiplin som sikrer en standard-gyldig PDF 1.4 med en ingen bibliotek under den
Metodene SaveAsPDF og klassen TXLSPDFExport vist her leveres med HotXLS Delphi Excel Component, sammen med eksportørene for CSV, HTML og RTF, og det fulle regneark-API-et for Delphi og C++Builder