Techninis straipsnis

HotXLS: lapu apsauga, puslapio konfiguracija ir spausdinimas Delphi

Trys grupes darbalakio nustatymu nieko bendra su lasteleiu reiksmemis ir viska apie tai, kaip failas elgiasi, kai palieka jusu koda. Lapu apsauga nusprendzia, kurias lasteles vartotojas gali redaguoti po to, kai perduodate darbaknygę. Puslapio konfiguracija fiksuoja orientacija, popieriaus dydi ir laukus. Spausdinimo nustatymai (pasikartojantys pavadinimo eilutai, mastelio ir rankinio puslapio pertrauku) valdo, kaip begalines ilgio tinklelis nusileistas ant popieriaus. Neienas is triju pasirodo, kai akiu apziurite duomenis ziumokle, ir visi trys tykiai suskaido lauke, kai jie neteisingi. HotXLS, gimtoji Delphi ir C++Builder skaiciuokliu biblioteka, atskleidzia pilta pavyrsiu .xls ir .xlsx, kas reiskia, kad ji taip pat atgamina kiekvieną neintuityvią Excel taisykle, iskepta tame pavyrsyje.

Pirmoji is siu taisykliu suklaidina beveik visus pirmą karta, kai jie saugo sugeneruota lapu. Iskvieskite Protect ir staiga niekas negali irasyti i jokia lastele, iskaitant ivesties stulpelius, kuriuos sukurete darbaknyge aplinkui. Jusu kodas neliete siu stulpeliu, ir tai yra tiksliai priezastis, kodel tai ivyksta.

Kiekviena lastele gimsta uzrakinta

ECMA-376 apibrezia locked kaip lasteles formatavimo iraso dali, o ne apsaugos savybe, ir ji numatytai yra true. Lapu apsauga yra tik jungiklis, kuris daro poziomi vykdomu. Todel visas tinklelis nesha uzrakto poziomi nuo tos akimirkos, kai egzistuoja, ramiai, o kvietimas Protect juos visus isjungia iš karto. Taisymas yra norint nustatyti tvarka tycia: sukurkite issdestyma, eksplicitiskai atrakinkite diapazonus, kuriuos vartotojai turi redaguoti, ir saugokite paskutiniu.

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 atlieka kaz ka atskira ir lengvai praleidzia: kol apsauga yra aktyvi, lastele vis tiek rodo apskaiciuota reiksmen, taciau formules juosta nieko nerodo. Tai svarbu, kai formule isauna atsiskaitymo tarifus, margas ar vertinimo svorius, kuriu nenorite perduoti kiekvienam gavejui, spustelinciam ant sumos. XLS fasade ta pati ketinima isprendziama vienam diapazonui per IXLSRange.Locked ir FormulaHidden. Darbalakis ten taip pat nesha penkiolika Allow* pozymiu (AllowSort, AllowAutoFilter, AllowFormatCells ir likusieji), todel apsaugotas lapas vis dar gali buti rusiuojamas ir filtruojamas, o ne uzsakytas kaip uzdaras eksponatas.

Ka apsaugos slaptazodis is tikruju saugo

Abu formatai issaugo lapu ir darbaknyges apsaugos slaptazodi kaip 4-hex-skaitmeniu senas maišą. Sesiolika bitu reiskia neskaitliuojama eiluciu susiduria su bet kokiu nurodytu slaptazodžiu, o paieikimo irankiai yra viena paieska toliau. Traktuokite apsauga kaip saugos dirzu nuo atsitiktiniu redagavimu, o ne kaip prieigos kontrole. Tai yra tinkamas irankis sustabdyti apzvalgininkams spausdinimo virš formuliu stulpelio ir netinkamas irankis viskam, kas susijusi su zodžiu konfidencialus.

Vienu lygiu auksciau, ProtectWorkbook XLSX fasade uzrakina darbaknyges strukturą, kas neleidzia prideti, pervardyti, istrinti ar persakyti lapu. Nustatykite ji, kai lapu sarasas pats yra sutartis su tolesnio srauto analizatoriumi, indeksuojanciu lapus pagal pavadinima arba pozicija. Pervardintas lapas padaugins importą kitoje puseje taip pat tiksliai kaip istrinto stulpelio. XLS fasadas atspindi sluoksnizmumą su TXLSWorkbook.Protect darbaknyges lygyje ir vienam-lapui Protect kvietimais, plius isProtected savybe kodui, kuriam reikia patikrinti paveldeto failo pries ji modifikuojant.

Kai reikalavimas yra tikrasis konfidencialumas, mechanizmas keiciasi visiIjai. SaveAsEncrypted sukuria AES-uzkoduota paketa pagal ECMA-376 standartine srifies schema, detaliai aprasyta AES-saugomos XLSX isvesties vadove, o sensas XLS fasadas raso ir skaito RC4-uzkoduotus .xls failus per EncryptionPassword ir slaptazodzio perkrovima Open. Skirtumas nera akademinis. Saugotas lapas keliauja teksto formate, todel bet koks zip irankis gali skaityti savo lasteleiu reiksmes, o uzkoduotas paketas yra neskaitomas be slaptazodzio. Audito eilute, kuri sako "darbo uzmokescio failas turi buti saugomas", beveik visada reiskia sifraciją, kokie zodynas jis buna naudoja.

Puslapio konfiguracija yra dokumento sutarties dalis

Spausdinimo elgesys yra nematomas ekrane, todėl daznai yra issiuncias sugadintas. Tą akimirka, kai klientas atspausdina darbaknygę, arba eksportuoja ja i PDF auditoriui, laukai, masteliai ir pasikartojantys pavadinimai tampa funkciniais reikalavimais, kurių niekas nebandė. XLSX fasade sios nuostatos tiesiogiai kabo nuo darbalakio:

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;

Dvi is tų eiluciu slepia spastinas. Antraste ir apostrova eilutes naudoja Excel formatavimo kodus: &P dabartiniam puslapiui, &N bendram skaiciui, su &L, &C ir &R, norint eksplicitiskai adresuoti tris sekcijas. Kita spastinas yra PrintArea, kuri tycia ima plika lasteleiu nuoroda. HotXLS issaugo ja nekvalifikuota ir priesmeta lapo pavadinima, kai raso faila, todel perduodant 'Timesheet!$A$1:$F$60' pats sukuria dvigubai-kvalifikuota, suformuota neteisingai nuoroda. Ta pati atsargumas taikomas vienu lygiu zemiaus: spausdinimo sritys ir spausdinimo pavadinimai yra issaugoti kaip integruoti apibrezi pavadinimai _xlnm.Print_Area ir _xlnm.Print_Titles, todel niekada nepridekite _xlnm.* irasu per DefinedNames ranka, arba abu mechanizmai kovos del to paties lizdo.

Mastelis, isgyvenes gamybos duomenu apimtis

Kombinacija FitToWidth := 1 su FitToHeight := 0 skaitoma kaip "visada talpinti stulpelius per viena puslapio, tada imti tiek puslapiu zemiaus, kiek reikia duomenims", ir tai yra teisingas numatytasis bet kuriai ataskaitai, kurios eiluciu skaicius svyruoja. Spastinas yra derinant fiksuota procenta arba talpinto-i-puslapio pora i trisdesimties-eiluciu bandymo faila: maitinkite tuos pacius nustatymus sesimsCia gamybos eilucimis ir isvestis arba sprogs i desimt nukirptų puslapiu arba sumažeja zemiaus skaitomumas. Keiskite ploti, leiskite auksciai augti ir pakartokite antraste eilutę per PrintTitleRows, kad septynioliktas puslapis vis dar buti skaitomas pats savaime.

Rankiniai luziai seka ta pati regeneravimo disciplina kaip viskas kita sugeneruotoje darbaknygeje. AddRowBreak(BeforeRow) pradeda nauja puslapio pries sekcijos riba, taciau kai generatorius paleistas is naujo ir eilutes keiciasi, senas luzis nusileida vidurio lenteleje. Iskviesite ClearAllPageBreaks pirmiausia, tada pridekite luzis, apskaiciuotus is generatoriaus savo eiluciu skaicikliu, o ne taisydami senas pozicijas. XLS fasade atitikmens valdikliai gyvena ant Sheet.PageSetup (orientacija, popieriaus dydis, laukai, antraste ir apostrofas eilutes, talpinti-i-puslapius), su RepeatRows ir RepeatColumns, apimancio spausdinimo pavadinimus.

Tikrinimas rezultato pries klientas tai daro

Apsauga ir spausdinimo klaidos dalijasi viena savybe: jas yra trivialiai patikrinti ranka ir beveik niekada patikrinamos. Atidarykite sugeneruota faila Excel ir praleisite devyniasdesimt sekundes ant jo. Irasyti i ivesties lastele ir patvirtinkite, kad ji priima klavisiu spaudima; irasyti i uzrakinta lastele ir patvirtinkite, kad pasirodo apsaugos raginimu; patikrinkite, kad pasleptoji formule palieka formules juosta tuscia. Tada paleiskite Spausdinimo Peržiūra prieš gamybos dydžio duomenų rinkini, o ne trisdesimties-eiluciu imtini, ir nuskaitykit puslapiu skaiciaus, pasikartojančios pavadinimo eilutes ir apostrofavo numeravimo. Peržiūra yra zingsnis, kuris atsimoka pats, nes spausdinimo geometrija priklauso nuo nustatymu be ekrano pavaizduotos, ir be fizinio spausdintuvo tai yra vienintelis vieta, kur mastelinio klaida kada nors tampa matoma.

Vienas paskutinis nustatymas uzbaigti apžvalga. FreezePane(ACol, ARow) laiko antraste bloka regejime, kai apzvalgininkuis slinkti. Tai yra ekrano elgesys, o ne spausdinimo elgesys, taciau apžvalgininkas vertina visa pristatyta is karto. Ir darbaknyge, kuri prasideda kaip projektuotojo-palaikomas isdestymas, gauna dauguma to nemokamai: sabalo ataskaitu generavimo darbo eiga laiko puslapio konfigūraciją šablone, kur zmogus ji suderino pagal realų spausdintuvą, ir palieka kodą pildyti duomenis ir vėl taikyti apsaugą, kai isdestymas nusistovi.

HotXLS yra gimtoji Object Pascal skaiciuokliu biblioteka Delphi ir C++Builder; pilna apsaugos ir puslapio konfigūracijos API nuoroda yra HotXLS Component produkto puslapyje.