Včasih je dostavljeno ni dokument, je slika tabele. Povzetek bloka v statusni e-pošti, upodobljena plošča KPI na nadzorni plošči, sličica ob rezultatu iskanja: vsi želijo celice in noben ne želi papir. TXLSCellImageExporter v HotXLS vzame klasični ali XLSX pravokotnik celic in proizvede en kompakten PNG ali JPEG brez velikosti strani, brez robov, brez glav ali nog, brez naslovov tiska in brez prelomov strani. Ločljivost, merilo, oblika in kakovost JPEG so nastavljivi, objekti, mrežne črte in obrobe celic imajo neodvisna stikala, ozadje je lahko barva ali prosojno, pisanje datoteke pa gre skozi atomsko zamenjavo v isti mapi, ki pusti obstoječi cilj nedotaknjen, če karkoli odpove
Razlog, zakaj to potrebuje svoj izvozitelj in ne zastavico na poti tiskanja, je, da paginacija ni neobvezna plast, ki jo lahko izklopite. To je stvar, za katero cevovod strani obstaja, da jo naredi
Zakaj ne upodobiti obsega skozi cevovod tiska?
Ker cevovod tiska vstavi stran med vas in celice. Velikost papirja odloči, koliko se prilega, robovi potisnejo vsebino navznoter, glave in noge zasedejo pasove, ki jih niste zahtevali, naslovi tiska ponovijo vrstice, ki jih že imate, in prelomi strani razcepijo obseg. Povzetek bloka, ki slučajno prečka prelom, pride ven kot dve sliki z zanimivo vrstico preklopi na pol. Lahko nadomestite vse to z nastavitvijo velikosti strani po meri, ki natanko ujema z obsegom, in ljudje to počnejo, ampak to pomeni ponovno računanje geometrije papirja vsakič, ko se obseg spremeni, in še vedno pusti pas glave in logiko naslovov tiska na poti
Izvozitelj celic izmeri pravokotnik, dodeli bitno sliko natanko te velikosti, nariše celice vanjo in kodira. Ni strani, zato ni ničesar za nastavitev stran. Za primere, kjer res želite papir, je pot izvoza PDF pravo orodje in je pokrita v članku o izvozu PDF delovnega lista
Izmerite, preden upodobite
Measure vrne slikovne mere, ki bi jih trenutne nastavitve proizvedle brez kodiranja česar koli. To je pomembno iz dveh razlogov. Predloga HTML ali e-pošte običajno potrebuje slikovne mere, preden slika obstaja, tako da lahko rezervira okvir in se izogne premiku razporeditve. In storitev, ki upodablja obsege, izbrane s strani uporabnikov, potrebuje način odklonitve absurdne zahteve, preden dodeli zanjo
uses
lxHandleX, lxPagination;
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Exporter: TXLSCellImageExporter;
Summary: TXLSXRange;
W, H, Bytes: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('quarter.xlsx');
Sheet := Book.Sheets.ByPos[0];
Summary := Sheet.Range['A1:F20'];
Exporter := TXLSCellImageExporter.Create;
try
Exporter.ImageFormat := xpifPng; // PNG ohranja tanke poteze ostre
Exporter.DPI := 96;
Exporter.Scale := 2.0; // izhod gostote retina
Exporter.IncludeGridlines := False;
Exporter.IncludeCellBorders := True;
Exporter.TransparentBackground := True;
Exporter.MaxPixels := 40 * 1000 * 1000;
Exporter.MaxBytes := 8 * 1024 * 1024;
if not Exporter.Measure(Summary, W, H) then
raise Exception.Create('range exceeds the configured budget');
// W in H sta zdaj znana; rezervirajte razporeditveni okvir pred kodiranjem
Bytes := Exporter.Save(Summary, 'summary.png');
if Bytes <= 0 then
raise Exception.Create('image export failed, previous file kept');
finally
Exporter.Free;
end;
finally
Book.Free;
end;
end;
Proračuni, ker se merilo množi
MaxPixels in MaxBytes nista obrambna dekoracija. Število pikslov raste s kvadratom faktorja merila in s kvadratom razmerja ločljivosti, zato obseg, ki je razumen 1200 krat 800 pri 96 DPI, postane približno 47 megapikslov pri 600 DPI, uporabnik, ki izbere celoten rabljeni obseg namesto povzetka bloka, pa doda še en red velikosti na vrh tega. Brez omejitve je način odpovedi dodelitev, ki je proces ne more zadostiti, kar podrje karkoli drugega, kar je ta proces počel
Z omejitvijo zahteva odpove in klicatelj dobi izbrati: odkloniti, zmanjšati merilo ali zožiti obseg. To je veliko boljši položaj za strežnik poročil in je isto utemeljevanje za izrecne proračune v dekodirniku metafila, opisanem v članku o omejenem dekodirniku EMF in WMF
Atomsko zamenjavanje in zakaj je mapa pomembna
Save na ime datoteke ne piše v cilj. Zapiše začasno datoteko v isti mapi, kodira vanjo in šele nato zamenja cilj. Če kodiranje odpove, če je proračun presežen na pol poti ali če je proces ubit, je prejšnja slika še vedno tam in še vedno veljavna. Nadzorna plošča, ki obnavlja svoje ploščice po urniku, zato nikoli ne pokaže odrezanega PNG, kar je običajni simptom naivnega pisanja, ki odpre cilj in začne tok
Podrobnost iste mape ni naključna. Atomsko zamenjavanje je samo atomsko znotraj ene nosilnosti, ker čez nosilnosti mora operacijski sistem kopirati in nato brisati, kar ponovno uvede okno, ki ste ga poskušali zapreti. Vsaka implementacija tega vzorca, ki daje svojo začasno datoteko v sistemsko mapo temp, ni atomsko na stroju, kjer izhod živi na drugem pogonu
Dogodki risanja rišejo na pravo platno
Tako izvozitelj obsega kot izvozitelj strani izpostavita vodilne in zaključne dogodke risanja in prejmeta poln kontekst samo za branje namesto samo ročaja platna. TXLSPagePaintContext nosi živo platno, slikovne meje, velikost strani v točkah, ločljivost in merilo, dejansko v rabi, številko strani dokumenta, številko strani znotraj lista, skupno število strani, ime lista in izvirni delovni list v obeh okusih klasičnem in XLSX. To je dovolj, da narišete vodni žig, ki se pravilno meri, ali žig strani, ki ve, kje je v teku
procedure TReportJob.StampDraft(Sender: TObject;
const AContext: TXLSPagePaintContext);
begin
// Zavedajoč se merila, tako da žig izgleda isto pri 1x in 3x
AContext.Canvas.Font.Height := Round(-48 * AContext.Scale);
AContext.Canvas.Font.Color := clSilver;
AContext.Canvas.Brush.Style := bsClear;
AContext.Canvas.TextOut(AContext.Bounds.Left + Round(24 * AContext.Scale),
AContext.Bounds.Top + Round(24 * AContext.Scale), 'DRAFT');
end;
Exporter.AfterPaint := Job.StampDraft;
Trije vedenja so vredna zanašanja. Dogodki sprožijo natanko enkrat na upodobljen okvir, vključno z vsakim okvirjem večstranskega TIFF, tako da je števec, povečan v ročaju, vreden zaupanja. Ostanejo tihi med merjenjem, tako da ročaj s stranskim učinkom ne teče dvakrat za en izhod. In če vodilni dogodek sproži izjemo, zaključni dogodek ne sproži in nobeni delni slikovni bajti niso zapisani, tako da izjema v vaši lastni kodi risanja ne more proizvesti pol označene datoteke
Izbira oblike
PNG za karkoli bogato z besedilom. JPEG uporabi blokovno transformacijo, ki proizvede vidno zvonjenje okoli tankih visoko kontrastnih potez, kar je natanko to, kar so obrobe celic in majhno besedilo, artefakti pa preživijo pri nastavitvah kakovosti, kjer fotografija izgleda popolno. JPEG si prisluži svoje mesto, ko obseg prevladajo vgrajene fotografije in velikost datoteke šteje več kot zvestoba robov. Prosojna ozadja zahtevajo PNG, ker JPEG nima kanala alfa, zato je ploščica, namenjena sedenju na obarvani površini, naredila izbiro za vas
Če vaš obseg vsebuje spojene celice, preverite izhod proti listu: spojene regije interagirajo s širinami stolpcev na načine, ki presenetijo ljudi, pravila razporeditve pa so pokrita v članku o spojenih celicah in predlogah poročil. HotXLS bere in piše XLS, XLSX, ODS in CSV iz Delphi in C++Builder brez odvisnosti Excel in polna površina izvozitelja je dokumentirana na strani produkta HotXLS Delphi spreadsheet component