Tehnični članek

HotXLS: Zaščita lista, nastavitev strani in tiskanje v Delphiju

Tri skupine nastavitev delovnega lista nimajo ničesar skupnega z vrednostmi celic in imajo vse skupnega z načinom obnašanja datoteke, ko zapusti vašo kodo. Zaščita lista odloča, katere celice lahko uporabnik uredi, ko mu izročite delovni zvezek. Nastavitev strani določi usmerjenost, velikost papirja in robove. Nastavitve tiskanja (ponovljene vrstice naslovov, skaliranje in ročni prelomi strani) nadzorujejo, kako se mreža poljubne dolžine preslika na papir. Nobena od treh se ne pokaže, ko si ogledujete podatke v pregledovalniku, in vse tri molče odpovejo v terenu, ko so napačne. HotXLS, izvorna knjižnica preglednic za Delphi in C++Builder, izpostavlja celotno površino za .xls in .xlsx, kar pomeni, da reproducira tudi vsako protiintuitivno pravilo Excela, ki je vgrajeno v to površino.

Prvo od teh pravil zbega skoraj vsakogar prvič, ko zaščiti generirani list. Pokličite Protect in naenkrat nihče ne more tipkati v nobeno celico, vključno z vnosnimi stolpci, ki ste jih zgradili v delovni zvezek. Vaša koda se teh stolpcev ni dotaknila, in to je točno razlog, zakaj se to zgodi.

Vsaka celica je rojena zaklenjena

ECMA-376 definira locked kot del zapisa oblikovanja celice in ne kot lastnost same zaščite, in privzeto je true. Zaščita lista je zgolj stikalo, ki naredi zastavico izvršljivo. Torej celotna mreža nosi zastavico zaklepanja od trenutka, ko obstaja, mirujočo, in klic Protect jih aktivira vse hkrati. Popravek je namerno nastaviti vrstni red: zgradite postavitev, izrecno odklenite obsege, ki jih morajo uporabniki urejati, in zaščitite zadnji.

Book := TXLSXWorkbook.Create;
try
  Sheet := Book.Sheets.Add('Timesheet');
  // ... header row, name column, and rate formulas written here ...
  Sheet.Range['B2:B50'].SetLocked(False);         // staff type hours here
  Sheet.Range['F2:F50'].SetFormulaHidden(True);   // keep the rate math private
  Sheet.Protect('review-2026');                   // now the lock flags bite
  Book.SaveAs('timesheet.xlsx');
finally
  Book.Free;
end;

SetFormulaHidden naredi nekaj ločenega in zlahka spregleda: medtem ko je zaščita aktivna, celica še vedno prikazuje svojo izračunano vrednost, toda vrstica formule ne prikazuje ničesar. To je pomembno, ko formula vsebuje računovodske stopnje, marže ali ponderate točkovanja, ki jih raje ne bi izročili vsakemu prejemniku, ki klikne na skupni seštevek. Na fasadi XLS se isti namen izrazi po obsegu prek IXLSRange.Locked in FormulaHidden. Delovni list tam nosi tudi petnajst zastavic Allow* (AllowSort, AllowAutoFilter, AllowFormatCells in ostale), tako da zaščiteni list še vedno omogoča razvrščanje in filtriranje in ne zamrzne v zapečateni razstavi.

Kaj geslo za zaščito dejansko ščiti

Oba formata shranjujeta geslo za zaščito lista in delovnega zvezka kot 4-heksadecimalni zastareli hash. Šestnajst bitov pomeni, da neštetih nizov trči z danim geslom, orodja za odstranjevanje pa so ena iskanje stran. Zaščito obravnavajte kot varnostni pas pred naključnimi ureditvami in ne kot nadzor dostopa. Je pravo orodje za preprečevanje recenzentom tipkanja v stolpec formul in napačno orodje za karkoli, kar vključuje besedo zaupno.

Eno raven višje ProtectWorkbook na fasadi XLSX zaklene strukturo delovnega zvezka, kar preprečuje dodajanje, preimenovanje, brisanje ali prerazporejanje listov. Nastavite ga vsakič, ko je seznam listov sam po sebi pogodba z razčlenjevalnikom dolvodni, ki indeksira liste po imenu ali položaju. Preimenovan list pokvari uvoz na drugi strani ravno tako zanesljivo kot izbrisani stolpec. Fasada XLS zrcali plast z TXLSWorkbook.Protect na ravni delovnega zvezka in klici Protect po listu, plus lastnost isProtected za kodo, ki mora pregledati podedovano datoteko, preden jo karkoli spremeni.

Ko je zahteva resnična zaupnost, se mehanizem v celoti spremeni. SaveAsEncrypted ustvari AES-šifrirani paket pod shemo standardnega šifriranja ECMA-376, podrobno pokrito v vodniku za zaščiteni izhod XLSX z AES, fasada zastarele XLS pa piše in bere datoteke .xls, šifrirane z RC4, prek EncryptionPassword in preobremenitve gesla Open. Razlika ni akademska. Zaščiteni list potuje v jasnem besedilu, zato ga lahko orodje za zip prebere vrednosti celic, medtem ko je šifrirani paket brez gesla neberljiv. Revizijska vrstica, ki pravi "datoteka s plačilno listo mora biti zaščitena", skoraj vedno pomeni šifriranje, ne glede na besedišče, ki ga použije.

Nastavitev strani je del pogodbe dokumenta

Obnašanje tiskanja je nevidno na zaslonu, kar je razlog, da se tako pogosto dostavlja napačno. V trenutku, ko stranka natisne delovni zvezek ali ga izvozi v PDF za revizorja, se robovi, skaliranje in ponovljeni naslovi spremenijo v funkcionalne zahteve, ki jih nihče ni preizkusil. Na fasadi XLSX te nastavitve visijo neposredno iz delovnega lista:

Sheet.PageLandscape := True;
Sheet.PaperSize := xlsxPaperA4;
Sheet.SetPageMargins(0.5, 0.5, 0.75, 0.75, 0.3, 0.3);
Sheet.CenterHeader := 'Monthly Timesheet';
Sheet.RightFooter := 'Page &P of &N';
Sheet.PrintArea := '$A$1:$F$60';     // bare reference: no sheet name here
Sheet.PrintTitleRows := '$1:$1';     // header row repeats on every page
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0;              // grow downward as the data grows
Sheet.PrintGridlines := False;

Dve od teh vrstic skrivata pasti. Nizi glave in noge uporabljajo Excelove kode oblikovanja: &P za trenutno stran, &N za skupno število, z &L, &C in &R za izrecno naslavljanje treh razdelkov. Druga past je PrintArea, ki namenoma sprejme golo referenco celice. HotXLS jo shrani nekvalificiranje in pred njej doda ime lista, ko piše datoteko, zato posredovanje 'Timesheet!$A$1:$F$60' sami ustvari dvojno kvalificirano in napačno oblikovano referenco. Ista previdnost velja eno raven nižje: območja tiskanja in naslovi tiskanja so shranjeni kot vgrajena definirana imena _xlnm.Print_Area in _xlnm.Print_Titles, zato nikoli ne dodajajte vnosov _xlnm.* prek DefinedNames ročno, ali pa bosta dva mehanizma tekmovala za isti prostor.

Skaliranje, ki preživi obsege produkcijskih podatkov

Kombinacija FitToWidth := 1 z FitToHeight := 0 se bere kot "vedno priredi stolpce čez eno stran, nato vzemi toliko strani navzdol, kolikor potrebuje podatke", in to je pravilna privzeta vrednost za vsako poročilo, katerega število vrstic se razlikuje. Past je uglaševanje fiksnega odstotka ali para prileganja strani glede na trideseto testno datoteko: pri istih nastavitvah s šest sto produkcijskimi vrsticami izhod ali eksplodira v desetine prikrojenih strani ali se skrči pod berljivost. Skalirajte širino, pustite dolžino rasti in ponovite glavo prek PrintTitleRows, da je stran sedemnajst še vedno berljiva sama po sebi.

Ročni prelomi sledijo enaki disciplini regeneracije kot vse ostalo v generiranem delovnem zvezku. AddRowBreak(BeforeRow) začne novo stran pred mejo razdelka, toda ko generator znova zažene in se vrstice premaknejo, zastarel prelom pristane sredi tabele. Najprej pokličite ClearAllPageBreaks, nato znova dodajte prelome, izračunane iz lastnih števcev vrstic generatorja, namesto da popravljate stare položaje. Na fasadi XLS enakovredni kontroli živijo na Sheet.PageSetup (usmerjenost, velikost papirja, robovi, nizi glave in noge, prileganje stranem), pri čemer RepeatRows in RepeatColumns pokrivajo naslove tiskanja.

Preverjanje rezultata pred stranko

Zaščita in hrošči tiskanja si delijo eno lastnost: trivialno je preveriti z roko in skoraj nikoli preveriti. Odprite generirano datoteko v Excelu in ji posvetite devetdeset sekund. Vtipkajte v celico za vnos in potrdite, da sprejme tipkanje; vtipkajte v zaklenjeno celico in potrdite, da se prikaže poziv za zaščito; preverite, da skrita formula pusti vrstico formule prazno. Nato zaženite predogled tiskanja glede na produkcijsko velik nabor podatkov in ne na trideseto vzorčno vrstico in preberite število strani, ponavljajočo vrstico naslova in številčenje noge. Predogled je korak, ki se plača sam, ker geometrija tiskanja je odvisna od nastavitev brez upodabljanja na zaslonu, in kratko pri fizičnem tiskalniku je edino mesto, kjer postane napaka pri skaliranju vidna.

Ena zadnja nastavitev zaokroži pregled. FreezePane(ACol, ARow) ohranja blok glave v pogledu, medtem ko recenzent pomikuje. To je obnašanje zaslona in ne tiskanja, toda recenzent ocenjuje celotno dostavo hkrati. In delovni zvezek, ki se začne kot postavitev, ki jo vzdržuje oblikovalec, dobi večino tega zastonj: potek dela za generiranje poročil predloge ohranja nastavitev strani v predlogi, kjer jo je človeška roka nastavila glede na pravi tiskalnik, in kodi prepusti, da zapolni podatke in znova nanese zaščito, ko se postavitev ustali.

HotXLS je izvorna knjižnica preglednic Object Pascal za Delphi in C++Builder; celotna referenca API za zaščito in nastavitev strani je na strani HotXLS Component.