Norėdami eksportuoti „Excel“ skaičiuoklės lapą į PDF iš Delphi arba C++Builder nenaudojant „Office“ programos, iškvieskite SaveAsPDF metodą HotXLS skaičiuoklės lape arba darbo knygoje. HotXLS yra vietinis VCL Excel komponentas, ir jo skaičiuoklės eksportas į PDF atvaizduoja lapo naudojamą diapazoną į savarankišką PDF 1.4 failą, perkeldamas „Excel“ stulpelių pločius bei langelio rodomą tekstą į A4 formato puslapius su automatiniu puslapiavimu. Skaičiavime nedalyvauja nei „Excel“ kopija, nei spausdintuvo tvarkyklė, nei išorinė DLL biblioteka
HotXLS traktuoja PDF kaip duomenų pateikimo formatą, kuris yra artimas jos CSV, TSV bei HTML eksporto keliams, o ne kaip pikselių tikslumo atvaizdavimo variklį. Eksportas atkuria lentelės turinį bei maketo struktūrą: reikšmes, kurias matote tinklelyje, stulpelių proporcijas bei tinklelio linijas aplink langelius. Šis rėmas yra svarbus, nes jis iš anksto nustato sąžiningą lūkestį, o likusi šio straipsnio dalis yra apie tai, kur tiksliai randasi ši riba
Kaip konvertuoti „Excel“ į PDF Delphi aplinkoje nenaudojant „Office“?
Trumpiausias kelias yra vienas iškvietimas. TXLSWorksheet pateikia SaveAsPDF(FileName) bei SaveAsPDF(Stream), o TXLSWorkbook pateikia tas pačias dvi perkrovas, kurios nukreipiamos į aktyvų lapą. Kiekviena grąžina Integer: 1 sėkmės atveju bei -1 nesėkmės atveju, todėl galite šakoti rezultatą neapgaubdami iškvietimo savo išimčių apdorojimu
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;
Kai skaičiuoklės lape iškviečiate SaveAsPDF, HotXLS eksportuoja to lapo UsedRange — visų užpildytų langelių ribojantįjį lauką. Darbo knygos perkrova yra patogumas, kuris perduoda darbą aktyviam lapui, todėl kelių lapų ataskaita arba pereina cikle per reikalingus lapus, arba prieš iškvietimą pasirenka aktyvą lapą. Nėra viso darbo knygos režimo, kuris vienu žingsniu sujungs kiekvieną skirtuką: kiekvienas iškvietimas atvaizduoja vieną lapą arba vieną diapazoną
Kaip HotXLS paverčia naudojamą diapazoną PDF puslapiais?
HotXLS pereina naudojamą diapazoną langelis po langelio ir išdėsto jį kaip puslapiais suskirstytą tinklelį. Stulpelių geometrija ateina tiesiai iš „Excel“: kiekvieno stulpelio plotis konvertuojamas iš „Excel“ pločio vieneto į tipografinius taškus su minimalia riba, kad joks stulpelis nesusitrauktų iki plonos juostelės. Kai stulpeliai kartu yra platesni už naudojamą puslapį, HotXLS tolygiai sumažina jų mastelį, kad tilptų; kai jie jau telpa, ji palieka juos natūralaus pločio, užuot ištempusi per visą lapą
Eilutės teka žemyn puslapiu, kol kita peržengs apatinę paraštę; tokiu atveju HotXLS atidaro naują puslapį ir tęsia toliau, todėl tūkstančio eilučių lapas sunumeruojamas savaime be jokių jūsų puslapio lūžių valdymo veiksmų. Kiekvienas langelis atspausdina savo FormattedText — rodomą eilutę, sukurtą pritaikius skaičių formatą, todėl data rodoma taip, kaip rodoma lape, o valiutos langelis išlaiko tūkstančių skirtukus bei simbolį. Tekstas, kuris netelpa savo stulpelyje, nukerpamas pagal langelio plotį, užuot išsiliejęs į kaimyninį langelį
Orientacijos, paraščių ir šrifto dydžio valdymas
Bet kokiam kitam maketui valdykite eksportuotoją tiesiogiai. Klasė TXLSPDFExport slepiasi už vienos eilutės pagalbinių funkcijų, ir ji pateikia tris savybes: Orientation (xlsPdfPortrait arba xlsPdfLandscape, portretas pagal nutylėjimą), Margin (taškai, numatytoji reikšmė 40) bei FontSize (taškai, numatytoji reikšmė 9). Nustatykite juos prieš iškviesdami SaveAsPDF, ir visas dokumentas juos perims
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 taip pat priima diapazoną, o ne visą lapą per SaveAsPDF(Range: IXLSRange; ...); būtent taip eksportuojate suvestinės bloką iš lapo, kuriame taip pat yra juodraštinių skaičiavimų. Ši diapazono perkrova yra ta pati, kuria skaičiuoklės pagalbinė funkcija remiasi viduje, todėl maketas, mastelio keitimas bei puslapiavimas elgiasi identiškai, nesvarbu, ar pateikiate pilną naudojamą diapazoną, ar pasirinktą sritį
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;
Kodėl HotXLS neįterpia šrifto: Helvetica bei WinAnsi kompromisas
HotXLS rašo tekstą naudodama PDF integruotą „Helvetica“ bei WinAnsiEncoding; tai yra sąmoningas pasirinkimas be jokių papildomų priklausomybių, turintis vieną realią ribą. Kadangi „Helvetica“ yra vienas iš standartinių 14 šriftų, kuriuos jau turi kiekviena reikalavimus atitinkanti PDF skaityklė, eksportuotojas visiškai neįterpia šrifto programos: failas išlieka mažas bei atsidaro bet kur, nereikalaujant licencijuoti ar platinti jokių failų. Šio pasirinkimo kaina yra simbolių rinkinys, kurį puslapis gali parodyti
WinAnsiEncoding apima Windows-1252 rinkinį, todėl lotyniškas tekstas, įprasti skyrybos ženklai bei Vakarų Europos diakritiniai ženklai atvaizduojami teisingai, o HotXLS pritaiko keletą tipografinių simbolių, lenktų kabučių, brūkšnių bei euro ženklą į jų CP1252 vietas. Simboliai už šio diapazono ribų (kinų, japonų, korėjiečių hieroglifai, kirilica, graikų bei arabų rašmenys) puslapyje virsta klaustuku. Jei jūsų lapuose yra ne lotyniškų tekstų, šis eksportuotojas yra netinkamas įrankis, ir labiau tiktų pilno stiliaus PDF atvaizdavimo variklis
Kur sustoja skaičiuoklės lapo eksportas į PDF
HotXLS atvaizduoja turinį bei struktūrą, o ne pilną vizualinį lapo stilių. Langelių užpildai, rėmelių stiliai, atskirų langelių šriftai bei spalvos, diagramos bei įterptieji vaizdai nepatenka į tai, ką nupiešia eksportuotojas; jūs gaunate tekstinį tinklelį su vienodomis tinklelio linijomis. Tai yra tas pats principas, kurio laikosi HTML bei RTF eksportuotojai, ir jis puikiai tinka ataskaitai ar duomenų perdavimui, kur skaičiai neša prasmę, o ne tema
Kai tikslas yra stilingas, prekės ženklą atitinkantis dokumentas, įprasta pirmiausia surinkti skaičius skaičiuoklės šablone, kas išsamiai aprašyta straipsnyje šablonais pagrįstas ataskaitų generavimo procesas. Ir kadangi niekas iš to neliečia COM ar veikiančios „Excel“ programos, visas srautas atitinka tą patį automatizacijos be „Office“ modelį, kurį HotXLS naudoja visur: grynas Pascal kodas, kurį galima įdiegti beekraniame serveryje, nereikalaujant licencijuoti ar prižiūrėti sąveikos procesų
Savarankiškas PDF, baitas po baito
HotXLS kuria PDF failo struktūrą rankiniu būdu bei apskaičiuoja jo kryžminių nuorodų lentelę iš tikslių baitų poslinkių; būtent todėl išvestį atidaro kiekviena skaityklė. Serijomis įrašydama kiekvieną objektą, HotXLS užfiksuoja to objekto pradinį poslinkį prieš pridėdama jo baitus, tada padidina einamąją poziciją ką tik įrašytu ilgiu, kad xref lentelė tiksliai nurodytų kiekvieną objektą, o startxref pažymėtų, kur ta lentelė prasideda. Skaitytuvas, kuris randa šiuos poslinkius net vienu baitu nukrypusius, atmeta visą failą, todėl savarankiškai apskaičiuotas poslinkis yra svarbiausia eksportuotojo dalis
Šis principas turi vieną griežtą pasekmę, kurią verta žinoti. Pages mazgas įrašomas pirmiausia kaip objektas 1, tačiau jo vaikinių puslapių sąrašas nėra žinomas tol, kol neišvedamas kiekvienas puslapis, todėl HotXLS išsaugo jį kaip vietos rezervuarą bei įrašo galutinius vaikus bei skaičių prieš paleidžiant poslinkių skaičiavimą, o ne po to. Kai objekto baitai išmatuojami xref lentelei, jie užšaldomi: pakeitus bent vieną baitą vėliau, pasislinktų kiekvienas sekantis poslinkis bei būtų sugadinta lentelė. Tai nedidelė drausmė, kuri užtikrina standartus atitinkantį PDF 1.4 failą nenaudojant jokių papildomų bibliotekų
Čia parodyti SaveAsPDF metodai bei TXLSPDFExport klasė platinami kartu su HotXLS Delphi Excel komponentu, taip pat CSV, HTML bei RTF eksportuotojais bei pilnu skaičiuoklės API, skirtu Delphi ir C++Builder