Technical Article

HotXLS: Zaštita lista, postavljanje stranice i ispis u Delphiju

Tri skupine postavki radnog lista nemaju nikakve veze s vrijednostima ćelija, ali imaju potpunu vezu s načinom na koji se datoteka ponaša nakon što napusti vaš kod. Zaštita lista odlučuje koje ćelije korisnik može uređivati nakon što preda radnu knjigu. Postavljanje stranice definira orijentaciju, veličinu papira i margine. Postavke ispisa (ponavljajući redci naslova, skaliranje i ručni prijelomi stranica) kontroliraju kako mreža proizvoljne duljine slijeće na papir. Nijedna od te tri skupine se ne prikazuje kada promatrate podatke u pregledniku, a sve tri tiho pucaju u radu kada su pogrešne. HotXLS, nativna Delphi i C++Builder biblioteka za proračunske tablice, izlaže kompletnu površinu za .xls i .xlsx, što znači da također reproducira svako kontraintuitivno Excel pravilo ugrađeno u tu površinu.

Prvo od tih pravila zbuni gotovo svakoga kada prvi put zaštiti generirani list. Pozovite Protect i odjednom nitko ne može pisati ni u jednu ćeliju, uključujući stupce za unos oko kojih ste izgradili radnu knjigu. Ništa u vašem kodu nije dotaknulo te stupce, i to je točno razlog zašto se to događa.

Svaka ćelija se rađa zaključana

ECMA-376 definira locked kao dio zapisa o oblikovanju ćelije, a ne kao svojstvo same zaštite, i prema zadanim je postavkama postavljen na True. Zaštita lista je samo prekidač koji čini tu zastavicu provedivom. Dakle, cijela mreža nosi zastavicu zaključavanja od trenutka kada postoji, uspavanu, a poziv prema Protect aktivira sve njih odjednom. Rješenje je namjerno postavljanje redoslijeda: izgradite izgled, eksplicitno otključajte raspone koje korisnici moraju uređivati i zaštitite na kraju.

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 radi nešto zasebno i lako uočljivo: dok je zaštita aktivna, ćelija i dalje prikazuje svoju izračunatu vrijednost, ali traka formule ne prikazuje ništa. To je važno kada formula ugrađuje stope naplate, marže ili težine bodovanja koje radije ne biste predali svakom primatelju koji klikne na ukupni iznos. Na XLS sučelju ista je namjera izražena po rasponu putem IXLSRange.Locked i FormulaHidden. Tamošnji radni list također nosi petnaest Allow* zastavica (AllowSort, AllowAutoFilter, AllowFormatCells i ostale), tako da se zaštićeni list i dalje može sortirati i filtrirati, umjesto da bude zamrznut u zapečaćeni izložak.

Što lozinka za zaštitu zapravo štiti

Oba formata pohranjuju lozinku za zaštitu lista i radne knjige kao naslijeđeni hash od 4 heksadecimalne znamenke. Šesnaest bitova znači da se bezbroj nizova sudara s bilo kojom lozinkom, a alati za uklanjanje su na jedno pretraživanje daleko. Tretirajte zaštitu kao sigurnosni pojas protiv slučajnih izmjena, a ne kao kontrolu pristupa. To je pravi alat za sprječavanje recenzenata da pišu preko stupca s formulama, a pogrešan alat za bilo što što uključuje riječ povjerljivo.

Jednu razinu iznad, ProtectWorkbook na XLSX sučelju zaključava strukturu radne knjige, što sprječava dodavanje, preimenovanje, brisanje ili promjenu redoslijeda listova. Postavite to kad god je popis listova sam po sebi ugovor s nizvodnim parserom koji indeksira listove po nazivu ili položaju. Preimenovani list kvari uvoz na drugoj strani jednako sigurno kao i izbrisani stupac. XLS sučelje odražava to slojevito postavljanje s TXLSWorkbook.Protect na razini radne knjige i pojedinačnim pozivima Protect po listu, uz svojstvo isProtected za kod koji treba pregledati naslijeđenu datoteku prije nego što je izmijeni.

Kada je zahtjev stvarna povjerljivost, mehanizam se u potpunosti mijenja. SaveAsEncrypted proizvodi paket šifriran AES-om prema shemi ECMA-376 Standard Encryption, što je detaljno pokriveno u vodiču za XLSX izlaz zaštićen AES-om, a naslijeđeno XLS sučelje piše i čita .xls datoteke šifrirane RC4 algoritmom putem EncryptionPassword i preopterećenja lozinke metode Open. Razlika nije samo akademska. Zaštićeni list putuje kao običan tekst, tako da bilo koji zip alat može čitati vrijednosti njegovih ćelija, dok je šifrirani paket nečitljiv bez lozinke. Revizijska linija koja kaže "platna datoteka mora biti zaštićena" gotovo uvijek znači šifriranje, bez obzira na vokabular koji koristi.

Postavljanje stranice je dio ugovora o dokumentu

Ponašanje ispisa je nevidljivo na zaslonu, zbog čega se tako često isporučuje neispravno. U trenutku kada kupac ispiše radnu knjigu ili je izveze u PDF za revizora, margine, skaliranje i ponavljajući naslovi pretvaraju se u funkcionalne zahtjeve koje nitko nije testirao. Na XLSX sučelju ove postavke vise izravno o radnom listu:

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;

Dva od tih redaka skrivaju zamke. Nizovi zaglavlja i podnožja koriste Excelove kodove za oblikovanje: &P za trenutnu stranicu, &N za ukupni broj, s &L, &C i &R za izričito adresiranje triju odjeljaka. Druga zamka je PrintArea, koja namjerno prima čistu referencu ćelije. HotXLS je pohranjuje nekvalificiranu i dodaje naziv lista kao prefiks kada piše datoteku, tako da ručno prosljeđivanje 'Timesheet!$A$1:$F$60' proizvodi dvostruko kvalificiranu, neispravnu referencu. Isti oprez vrijedi i jednu razinu niže: područja ispisa i naslovi ispisa traju kao ugrađeni definirani nazivi _xlnm.Print_Area i _xlnm.Print_Titles, stoga nikada ne dodajte unose _xlnm.* ručno kroz DefinedNames, inače će se ta dva mehanizma boriti oko istog utora.

Skaliranje koje preživljava produkcijske količine podataka

Kombinacija FitToWidth := 1 s FitToHeight := 0 glasi kao "uvijek smjesti stupce preko jedne stranice, a zatim uzmi onoliko stranica prema dolje koliko podaci zahtijevaju", i to je ispravna zadana vrijednost za bilo koje izvješće čiji broj redaka varira. Zamka je ugađanje fiksnog postotka ili para prilagodbe stranici prema testnoj datoteci od trideset redaka: nahranite iste postavke sa šest stotina produkcijskih redaka i izlaz će ili eksplodirati u desetke odrezanih stranica ili se smanjiti ispod granice čitljivosti. Skalirajte širinu, pustite duljinu da raste i ponovite redak zaglavlja kroz PrintTitleRows kako bi stranica sedamnaest i dalje bila čitljiva sama za sebe.

Ručni prijelomi slijede istu disciplinu regeneracije kao i sve ostalo u generiranoj radnoj knjizi

Ručni prijelomi slijede istu disciplinu regeneracije kao i sve ostalo u generiranoj radnoj knjizi. AddRowBreak(BeforeRow) započinje novu stranicu prije granice odjeljka, ali kada se generator ponovno pokrene i redci se pomaknu, zastarjeli prijelom slijeće u sredinu tablice. Najprije pozovite ClearAllPageBreaks, a zatim ponovno dodajte prijelome izračunate iz vlastitih brojača redaka generatora umjesto krpanja starih položaja. Na XLS sučelju ekvivalentne kontrole žive na Sheet.PageSetup (orijentacija, veličina papira, margine, nizovi zaglavlja i podnožja, prilagodba stranicama), dok RepeatRows i RepeatColumns pokrivaju naslove ispisa.

Provjera rezultata prije nego što to učini kupac

Pogreške u zaštiti i ispisu dijele jedno svojstvo: trivijalne su za ručnu provjeru i gotovo se nikada ne provjeravaju. Otvorite generiranu datoteku u Excelu i potrošite devedeset sekundi na nju. Upišite nešto u ulaznu ćeliju i potvrdite da prihvaća unos; upišite nešto u zaključanu ćeliju i potvrdite da se pojavljuje upit za zaštitu; provjerite da skrivena formula ostavlja traku formule praznom. Zatim pokrenite pretpregled ispisa (Print Preview) na skupu podataka produkcijske veličine, a ne na uzorku od trideset redaka, te očitajte broj stranica, ponavljajući redak naslova i numeriranje podnožja. Pretpregled je korak koji se sam isplati jer geometrija ispisa ovisi o postavakama bez prikaza na zaslonu, a osim fizičkog pisača to je jedino mjesto gdje pogreška u skaliranju ikada postaje vidljiva.

Provjera rezultata prije nego što to učini kupac

Još jedna zadnja postavka zaokružuje pregled. FreezePane(ACol, ARow) drži blok zaglavlja na vidiku dok recenzent skrola. To je ponašanje zaslona, a ne ponašanje ispisa, ali recenzent ocjenjuje cijeli isporučeni dokument odjednom. A radna knjiga koja počinje život kao izgled koji održava dizajner dobiva većinu ovoga besplatno: tijek rada za generiranje izvješća na temelju predloška drži postavke stranice u predlošku, gdje ih je čovjek uskladio s pravim pisačem, i ostavlja kodu da popuni podatke i ponovno primijeni zaštitu nakon što se izgled ustali.

HotXLS je nativna Object Pascal biblioteka za proračunske tablice za Delphi i C++Builder; cjelovita API referenca za zaštitu i postavljanje stranice nalazi se na stranici proizvoda HotXLS komponente.