Predajete gotovu radnu knjigu kolegi i tražite da je filtrira, a ne prepisuje. Zato štitite list. U starijim HotXLS gradnjama taj je potez u datoteku pisao samo jednu stvar: <sheetProtection sheet="1" objects="1" scenarios="1"/>, tvrdo zadanu, svaki put. List se zaključao, hash lozinke je bio pridružen, a korisnik nije mogao ništa, čak ni sortiranje i filtriranje koje ste zapravo htjeli ostaviti otvorenim. Excelov vlastiti dijalog "Protect Sheet" ima petnaest kućica upravo iz tog razloga, a engine nije mogao izraziti nijednu od njih. Ta praznina je ono što model zaštite u v2.91.0 zatvara
HotXLS je izvorna VCL spreadsheet komponenta za Delphi i C++Builder koja čita i piše XLS i XLSX bez instaliranog Excela. Ovaj članak govori o XLSX strani zaštite radnog lista: novi TXLSXSheetProtectionOption enum, AllowOption property koji uključuje svako dopuštenje, i jedno OOXML pravilo kodiranja koje sapliće svakoga tko ručno piše <sheetProtection> element
Što zaštita radnog lista zapravo čuva
Prvo, granica, jer ona određuje koliko biste trebali vjerovati ičemu od ovoga. Zaštita radnog lista u OOXML spreadsheet formatu (ECMA-376) je politika interakcije, a ne enkripcija. Ona govori kompatibilnoj aplikaciji koje izmjene treba odbiti dok je list zaštićen. Vrijednosti ćelija i dalje sjede u xl/worksheets/sheetN.xml kao običan tekst; raspakirajte .xlsx i tu su. Opcionalna lozinka pohranjena je kao kratki naslijeđeni hash, a ne kao ključ koji išta šifrira. Svatko tko preimenuje datoteku, otvori part i ukloni <sheetProtection> red može pročitati i uređivati sve
Dakle, zaštita odgovara na "spriječi kolegu da slučajno pregazi formulu", a ne na "sakrij te podatke od nekoga motiviranog." To su različiti problemi s različitim alatima. Ako trebate povjerljivost, želite enkripciju na razini radne knjige opisanu u XLSX izlaza zaštićenog AES-om, koja doista šifrira paket. Zaštita lista i enkripcija radne knjige skladno se nadopunjuju, ali samo je druga brava. Držite tu liniju jasnom i ostatak ove stranice je samo instalacija
Petnaest opcija i svojstvo AllowOption
Svaki radni list sada nosi skup TXLSXSheetProtectionOption vrijednosti koje opisuju što korisnik još smije raditi dok je list zaštićen. Članovi se jedan-na-jedan preslikavaju na OOXML atribute i na kućice u Excel dijalogu:
xlsxSpoEditObjects,xlsxSpoEditScenarios- uređivanje crtežnih objekata i what-if scenarijaxlsxSpoFormatCells,xlsxSpoFormatColumns,xlsxSpoFormatRows- ponovno oblikovanje ćelija, stupaca, redakaxlsxSpoInsertColumns,xlsxSpoInsertRows,xlsxSpoInsertHyperlinks- umetanje stupaca, redaka, poveznicaxlsxSpoDeleteColumns,xlsxSpoDeleteRows- brisanje stupaca, redakaxlsxSpoSelectLockedCells,xlsxSpoSelectUnlockedCells- premještanje odabira na zaključane ili otključane ćelijexlsxSpoSort,xlsxSpoAutoFilter,xlsxSpoPivotTables- sortiranje raspona, korištenje AutoFilter padajućih izbornika, rad s PivotTables
Vrijednosti čitaš i zapisuješ pojedinačne bitove kroz indeksirano AllowOption svojstvo na TXLSXWorksheet. AllowOption[Opt] = True znači da je radnja dopuštena; postavljanje na False je zabranjuje. Cijeli skup je također dostupan odjednom kroz SheetProtectionOptions, TXLSXSheetProtectionOptions (običan Pascal set of), pa ga možete spremiti, vratiti ili potpuno zamijeniti
Zadana vrijednost je važna i namjerna: novostvoreni radni list počinje tako da je svaka opcija dopuštena. Konstruktora SheetProtectionOptions s punim rasponom, [Low(TXLSXSheetProtectionOption)..High(TXLSXSheetProtectionOption)]. Odande sužavate tako da izostavite radnje koje želite zabraniti, umjesto da gradite skup dopuštenja od nule. Taj izbor je ono što niže opisano pravilo kodiranja writer-a poravnava s Excelovim ponašanjem
Štiti list, ali ostavlja sortiranje i filtriranje otvorenim
Evo čestog slučaja od početka do kraja: zaštitite gotov izvještaj tako da se raspored ne može mijenjati, ali dopustite čitatelju da ga sortira i filtrira. Primijetite da Protect i opcije su neovisni. Protect prebacuje list u zaštićeno stanje i sprema opcijski hash lozinke; ne dira skup opcija. Vi prilagođavate AllowOption zasebno, a prekidači stupaju na snagu kad je list zaštićen i spremljen
var
wb: TXLSXWorkbook;
sh: TXLSXWorksheet;
begin
wb := TXLSXWorkbook.Create;
try
sh := wb.Sheets.Add('Protected');
sh.Cells[1, 1].Value := 'Region'; sh.Cells[1, 2].Value := 'Units';
sh.Cells[2, 1].Value := 'North'; sh.Cells[2, 2].Value := 120;
sh.Cells[3, 1].Value := 'South'; sh.Cells[3, 2].Value := 98;
// Protect with a password. This only sets the protected state + hash;
// the option set is left at its all-permitted default.
sh.Protect('HotXLS-2026');
// Narrow: keep sort + AutoFilter, forbid reshaping and reformatting.
sh.AllowOption[xlsxSpoSort] := True;
sh.AllowOption[xlsxSpoAutoFilter] := True;
sh.AllowOption[xlsxSpoFormatCells] := False;
sh.AllowOption[xlsxSpoFormatColumns] := False;
sh.AllowOption[xlsxSpoFormatRows] := False;
sh.AllowOption[xlsxSpoInsertRows] := False;
sh.AllowOption[xlsxSpoDeleteRows] := False;
if wb.SaveAs('protection.xlsx') <> 1 then
Writeln('SaveAs failed');
finally
wb.Free;
end;
end;
Dvema stvarima vrijedi stati na ovom isječku. Sort i AutoFilter redci pišu se izričito iako je zadana vrijednost za oba True; to je dokumentacija za sljedećeg održavatelja, a ne funkcionalni zahtjev. A budući da su zadane vrijednosti permisivne, jedini redci koji mijenjaju izlaznu datoteku su oni koji neku opciju postavljaju na False. To nije slučajnost ovog API-ja, nego OOXML žični format koji izbija na površinu, što je sljedeći odjeljak
Pravilo kodiranja: izostavljeno znači dopusti, attr=0 znači zabrani
Ovo je jedina kontraintuitivna činjenica u cijeloj značajci, i ovdje ručno pisani <sheetProtection> obično griješi. U OOXML-u je svaki atribut po radnji zabrani zastavica, a njegov izostanak znači dopuštenje. Atribut koji nedostaje znači da je radnja dopuštena. Atribut zapisan kao "0" znači da je radnja zabranjena dok je list zaštićen. Ne postoji formatCells="1" u dobro oblikovanoj datoteci da znači "formatiranje je dopušteno"; jednostavno izostavite atribut. (Zadana vrijednost za izostali atribut je OOXML-ova boolovska zadana vrijednost true, a ti su atributi imenovani tako da "true" znači da je odgovarajuća izmjena dopuštena.)
HotXLS writer to zrcali točno tako. Ispisuje sheet="1" da uključi zaštitu, a zatim prolazi kroz skup opcija i piše attr="0" samo za opcije koje ste postavili na False. Dopuštene radnje ne pridonose ničemu izlazu. Dakle, radna knjiga iz prethodnog odjeljka serializira se otprilike ovako, noseći samo zabranjene radnje plus hash lozinke:
// Conceptual output for the snippet above (attributes elided for brevity):
// <sheetProtection sheet="1"
// formatCells="0" formatColumns="0" formatRows="0"
// insertRows="0" deleteRows="0"
// password="...4-hex..."/>
// Note what is NOT there: no sort, no autoFilter, no selectLockedCells.
// Their absence is exactly what tells Excel those actions stay allowed.
Ako ste došli iz starog hard-coded stringa i očekivali vidjeti svaki atribut ispisan, ovo izgleda štedljivo, gotovo pogrešno. Ali ispravno je. Datoteka koja bi navela sort="1" i autoFilter="1" značila bi isto za kompatibilnog čitatelja, ali Excel sam piše minimalni forbid-only oblik, a njegovo kopiranje drži diffeove malima i povratne prolaze dosadnima. objects i scenarios atributi slijede identično pravilo: zadano su dopušteni, pa se pojavljuju samo kao "0" kada ih zabranite, što je obratobjects="1" scenarios="1" starog
koji je uvijek bio ispisivan
Čitanje zaštite natrag: vjernost povratnog prolazaParseWorksheetXmlModel dopuštenja koji možete zapisati, ali ne i pročitati, jednosmjerna je vrata, a uobičajeni simptom je ciklus učitaj-izmijeni-spremi koji tiho proširuje dopuštenja. HotXLS to zatvara. Kada <sheetProtection> naiđe na AllowOption s istom konvencijom u obrnutom smjeru: atribut prisutan i jednak "0" zabranjuje radnju; atribut koji nedostaje ostavlja opciju na njezinoj dopuštenoj zadanoj vrijednosti
var
wb: TXLSXWorkbook;
sh: TXLSXWorksheet;
begin
wb := TXLSXWorkbook.Create;
try
wb.LoadFromFile('protection.xlsx');
sh := wb.Sheets[1]; // XLSX sheets are 1-based
if sh.IsProtected then
begin
Writeln('Protected; password hash present: ',
sh.SheetProtectHash <> '');
Writeln('Sort allowed: ', sh.AllowOption[xlsxSpoSort]);
Writeln('AutoFilter allowed: ', sh.AllowOption[xlsxSpoAutoFilter]);
Writeln('FormatCells allowed:', sh.AllowOption[xlsxSpoFormatCells]);
end;
finally
wb.Free;
end;
end;
Učitajte datoteku koju je writer proizveo i dobit ćete Sort i AutoFilter natrag kao True, FormatCells kao False — skup koji ste spremili, netaknut. Ta simetrija je cijela poanta: izmijenite jednu ćeliju na zaštićenom, djelomično dopuštenom listu i ponovno spremite, a četrnaest dopuštenja koja niste dirali preživjet će umjesto da se uruše natrag na stari all-or-nothing zadani
Praktične napomene i ograničenja
Nekoliko stvari vrijedi znati prije nego što ovo ugradite u izvještajni cjevovod:
- Lozinka je slaba po dizajnu. Zaštita XLSX radnog lista pohranjuje 16-bitni naslijeđeni hash (isti onaj koji Excel koristi desetljećima), zadržan ovdje zbog interoperabilnosti. On sprječava slučajne izmjene; ne opire se napadaču. Nemojte ga tretirati kao čuvara tajni. Za stvarnu zaštitu, enkriptirajte radnu knjigu
- Postavljanje opcija prije zaštite je u redu.
AllowOptionse mogu dodijeliti bez obzira na to je li list trenutno zaštićen; prekidači jednostavno opisuju što će zaštita dopustiti kadProtectstupi na snagu.UnProtectbriše zaštićeno stanje i hash, ali ostavlja vaš skup opcija na mjestu za sljedeći put - Semantika zaključanih ćelija i dalje vrijedi. Zaštita blokira samo izmjene ćelija čiji je
Lockedatribut postavljen (zadana vrijednost radne knjige). Ostavljanje ulaznog područja koje se može uređivati posao je stila ćelije, a ne opcije zaštite; ta dva sloja kombiniraju se kao u Excelu - Ovo je XLSX engine. Model opcija zrcali starije
Allow*svojstvo XLS enginea, ali enum i nazivi svojstava ovdje (xlsxSpo*,AllowOption) pripadajuTXLSXWorksheetulxHandleX. Ako također upravljate rasporedom ispisa na istim listovima, prolazak kroz zaštitu i postavke stranice pokazuje kako ti postavke sjede uz područja ispisa i zaglavlja, a provjera valjanosti podataka, AutoFilter i tablice prirodno se uklapa s ostavljanjemxlsxSpoAutoFilterotvorenim na zaključanom izvještaju
Finozrnat model zaštite i ostatak XLSX read/write enginea dolaze u HotXLS Component za Delphi i C++Builder; stranica proizvoda nosi puni API radnog lista uključujući cjelovitu referencu opcija zaštite