Tehnički članak

HotXLS: Zaštita lista, podešavanje stranice i štampanje u Delphi-ju

Tri grupe podešavanja radnog lista nemaju nikakve veze sa vrednostima ćelija, već sa načinom na koji se fajl ponaša kada napusti vaš kod. Zaštita lista (sheet protection) odlučuje koje ćelije korisnik može da menja nakon što mu predate radnu svesku. Podešavanje stranice (page setup) definiše orijentaciju, veličinu papira i margine. Podešavanja štampanja (ponovljeni redovi zaglavlja, skaliranje i ručni prelomi stranica) kontrolišu kako mreža proizvoljne dužine sleće na papir. Nijedno od ova tri podešavanja se ne vidi kada samo letimično pogledate podatke u pregledaču, a sva tri tiho zakazuju na terenu kada su pogrešna. HotXLS, izvorna biblioteka za tabele u Delphi-ju i C++Builder-u, izlaže kompletan interfejs za .xls i .xlsx formate, što znači da takođe reprodukuje svako kontraproduktivno pravilo Excel-a ugrađeno u taj sistem

Prvo od tih pravila zbuni skoro svakoga kada prvi put zaštite generisani list. Pozovite metodu Protect i odjednom niko ne može da piše ni u jednu ćeliju, uključujući i kolone za unos oko kojih ste izgradili radnu svesku. Ništa u vašem kodu nije dotaklo te kolone, i to je upravo razlog zašto se to dešava

Svaka ćelija se rađa zaključana

Standard ECMA-376 definiše locked kao deo zapisa o formatiranju ćelije, a ne kao svojstvo same zaštite, i ono je podrazumevano postavljeno na true (tačno). Zaštita lista je samo prekidač koji omogućava sprovođenje ove oznake. Dakle, čitava mreža nosi oznaku zaključavanja od trenutka kada postoji, ali ona miruje, a poziv metode Protect aktivira sve njih odjednom. Rešenje je da redosled postavite namerno: izgradite raspored, eksplicitno otključate opsege koje korisnici moraju da menjaju, 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;

Metoda SetFormulaHidden radi nešto posebno i lako se previdi: dok je zaštita aktivna, ćelija i dalje prikazuje svoju izračunatu vrednost, ali traka za formule ne prikazuje ništa. To je važno kada formula sadrži stope naplate, marže ili težine ocenjivanja koje ne biste želeli da predate svakom primaocu koji klikne na ukupnu vrednost. Na XLS fasadi se ista namera izražava po opsegu preko svojstava IXLSRange.Locked i FormulaHidden. Radni list tamo takođe nosi petnaest Allow* zastavica (AllowSort, AllowAutoFilter, AllowFormatCells itd.), tako da se zaštićeni list i dalje može sortirati i filtrirati umesto da bude zamrznut u zapečaćeni dokument

Šta lozinka za zaštitu zapravo štiti

Oba formata čuvaju lozinku za zaštitu lista i radne sveske kao zastareli heš od 4 heksadecimalne cifre. Šesnaest bita znači da se bezbroj stringova poklapa sa bilo kojom zadatom lozinkom, a alati za uklanjanje su na samo jednu pretragu od vas. Tretirajte zaštitu kao sigurnosni pojas protiv slučajnih izmena, a ne kao kontrolu pristupa. To je pravi alat za sprečavanje recenzenata da pišu preko kolona sa formulama, a pogrešan alat za bilo šta što uključuje reč poverljivo

Jedan nivo iznad, metoda ProtectWorkbook na XLSX fasadi zaključava strukturu radne sveske, što sprečava dodavanje, preimenovanje, brisanje ili promenu redosleda listova. Podesite ovo kad god je sama lista listova ugovor sa nizvodnim parserom koji indeksira listove po nazivu ili poziciji. Preimenovani list kvari uvoz na drugoj strani jednako sigurno kao i obrisana kolona. XLS fasada odražava ove nivoe sa metodom TXLSWorkbook.Protect na nivou radne sveske i pojedinačnim pozivima Protect na nivou lista, uz svojstvo isProtected za kod koji treba da pregleda nasleđeni fajl pre nego što išta promeni

Kada je zahtev stvarna poverljivost podataka, mehanizam se u potpunosti menja. Metoda SaveAsEncrypted proizvodi paket šifrovan AES algoritmom u okviru ECMA-376 standardne šeme šifrovanja (Standard Encryption), koja je detaljno pokrivena u vodiču za AES-zaštićeni XLSX izlaz, dok zastarela XLS fasada upisuje i čita .xls fajlove šifrovane RC4 algoritmom preko svojstva EncryptionPassword i preopterećenja lozinke u metodi Open. Razlika nije akademska. Zaštićeni list se prenosi u čistom tekstu (cleartext), pa bilo koji zip alat može pročitati vrednosti njegovih ćelija, dok je šifrovani paket nečitljiv bez lozinke. Revizorski zahtev koji kaže "platni spisak mora biti zaštićen" skoro uvek zapravo znači šifrovanje, bez obzira na rečnik koji se koristi

Podešavanje stranice je deo ugovora o dokumentu

Ponašanje pri štampanju je nevidljivo na ekranu, zbog čega se tako često isporučuje neispravno. Onog trenutka kada klijent odštampa radnu svesku, ili je izveze u PDF za revizora, margine, skaliranje i ponovljeni naslovi postaju funkcionalni zahtevi koje niko nije testirao. Na XLSX fasadi ova podešavanja se nalaze direktno na objektu radnog 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 tih linija kriju zamke. Stringovi zaglavlja i podnožja (header i footer) koriste Excel-ove kodove za formatiranje: &P za trenutnu stranicu, &N za ukupan broj, sa &L, &C i &R za eksplicitno adresiranje tri odeljka. Druga zamka je PrintArea, koja namerno uzima čistu referencu ćelije. HotXLS je čuva nekvalifikovanu i dodaje naziv lista kao prefiks kada upisuje fajl, tako da ručno prosleđivanje 'Timesheet!$A$1:$F$60' proizvodi dvostruko kvalifikovanu, neispravnu referencu. Isti oprez važi i jedan nivo niže: opsezi štampe i naslovi štampe se perzistiraju kao ugrađena definisana imena _xlnm.Print_Area and _xlnm.Print_Titles, pa nikada nemojte ručno dodavati _xlnm.* unose kroz DefinedNames, jer će se ova dva mehanizma boriti za isti slot

Skaliranje koje preživljava produkcione količine podataka

Kombinacija FitToWidth := 1 sa FitToHeight := 0 tumači se kao "uvek uklopi kolone po širini na jednu stranicu, a zatim zauzmi onoliko stranica na dole koliko podacima treba", i to je ispravno podrazumevano podešavanje za svaki izveštaj čiji broj redova varira. Zamka je u podešavanju fiksnog procenta ili uklapanja na jednu stranicu u odnosu na test fajl od trideset redova: dajte ista podešavanja za šest stotina produkcionih redova i izlaz će se ili raspasti na desetine odsečenih stranica ili će se skupiti ispod granice čitljivosti. Skalirajte širinu, pustite dužinu da raste i ponovite red zaglavlja preko PrintTitleRows tako da je i sedamnaesta stranica čitljiva sama za sebe

Ručni prelomi prate istu disciplinu regeneracije kao i sve ostalo u generisanoj radnoj svesci. Metoda AddRowBreak(BeforeRow) započinje novu stranicu pre granice odeljka, ali kada se generator ponovo pokrene i redovi se pomere, zastareli prelom završava na sredini tabele. Prvo pozovite ClearAllPageBreaks, a zatim ponovo dodajte prelome izračunate iz sopstvenih brojača redova generatora, umesto da krpite stare pozicije. Na XLS fasadi ekvivalentne kontrole se nalaze u Sheet.PageSetup (orijentacija, veličina papira, margine, stringovi zaglavlja i podnožja, uklapanje stranica), dok RepeatRows i RepeatColumns pokrivaju naslove štampe

Provera rezultata pre nego što to uradi klijent

Greške u zaštiti i štampanju dele jedno svojstvo: trivijalne su za ručnu proveru, ali se skoro nikada ne proveravaju. Otvorite generisani fajl u Excel-u i posvetite mu devedeset sekundi. Upišite nešto u ulaznu ćeliju i potvrdite da prihvata unos; upišite nešto u zaključanu ćeliju i potvrdite da se pojavljuje obaveštenje o zaštiti; proverite da li skrivena formula ostavlja traku za formule praznom. Zatim pokrenite pregled pre štampe (Print Preview) nad skupom podataka produkcione veličine, a ne nad uzorkom od trideset redova, i očitajte broj stranica, ponovljeni red naslova i numerisanje u podnožju. Pregled je korak koji se višestruko isplati, jer geometrija štampe zavisi od podešavanja koja nemaju ekranski prikaz, i osim fizičkog štampača, to je jedino mesto gde greška u skaliranju uopšte postaje vidljiva

Još jedno poslednje podešavanje zaokružuje pregled. Metoda FreezePane(ACol, ARow) drži blok zaglavlja u vidokrugu dok recenzent skroluje. To je ekransko ponašanje, a ne ponašanje pri štampanju, ali recenzent ocenjuje ceo isporučeni rad odjednom. Radna sveska koja počinje svoj život kao raspored koji održava dizajner dobija većinu ovoga besplatno: radni tok generisanja izveštaja na osnovu šablona zadržava podešavanje stranice u šablonu, gde ga je čovek podesio u odnosu na stvarni štampač, i prepušta kodu samo da popuni podatke i ponovo primeni zaštitu kada se raspored stabilizuje

HotXLS je izvorna Object Pascal biblioteka za tabele za Delphi i C++Builder; kompletna API referenca za zaštitu i podešavanje stranica nalazi se na stranici proizvoda HotXLS komponenta