Klasični XLS i XLSX izlažu isti ugovor bez nuspojava za razvrstavanje unosa formule prije nego što pozivatelj promijeni ćeliju
Zajednički pravilnik
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Klasični IXLSWorkbook i TXLSWorkbook izlažu svojstvo zajedno s TXLSXWorkbook; XLSDefaultFormulaEntryPolicy isprazni prazan unos i odbije nepoznate funkcije i nepoznata definirana imena
Svojstvo radne knjige kopira se po vrijednosti i provjerava atomarno pri dodjeli, pa nepodržane vrijednosti nabrajanja podižu EArgumentOutOfRangeException bez promjene prethodnog pravilnika
Rezultat provjere
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue razlikuje odsutnost pogreške, nepoznatu funkciju, nepoznato ime, sintaksnu pogrešku, ograničenje ciljnog formata i nevažeće ciljne koordinate
Action bira pražnjenje ćelije, pohranu znakovnog niza, pohranu formule ili odbijanje, dok Symbol prepoznaje nepoznatu funkciju ili ime kada je neko bilo prepoznato
Prazan tekst i formule
Unos koji je točno prazan vraća xlfeaClearCell ili xlfeaStoreString prema EmptyStringMode
Formula koja vraća prazan znakovni niz, poput ="", ostaje formula i vraća xlfeaStoreFormula kada je ciljni format može prikazati
Tekst formule može sadržavati ili izostaviti jedan vodeći znak jednakosti
Dodjela točno praznog znakovnog niza kroz uobičajeno svojstvo Value ćelije u klasičnom XLS-u ili XLSX-u sada izravno primjenjuje ovaj način: zadano uklanja svaku postojeću vrijednost ili formulu, dok xlfesmPreserveString zamjenjuje sadržaj ćelije konstantnim nizom čija je duljina nula
Null i Unassigned uvijek isprazne ćeliju u oba načina, dok prava formula poput ="" ostaje formula s neovisno pohranjenim ili izračunatim rezultatom praznog niza
Pisači redaka ili stupaca XLSX za string i Variant primjenjuju isto pravilo bez materijaliziranja ispražnjenih praznina te zadržavaju spremište u paketima dok god preostale vrijednosti mogu biti prikazane u njemu
Izvorni čitači XLS, XLSX i ODS te pretvarači XLS-to-XLSX ili XLSX-to-XLS smatraju pohranjene vrijednosti pouzdanim unosom, pa konstanta praznog niza na razini datoteke preživi i kada odredišna radna knjiga zadrži zadani pravilnik korisničkog unosa
Nepoznati simboli i ciljni formati
Registrirane korisničke funkcije u opsegu radne knjige ili procesa i dodijeljene povratne pozive OnUserFunction ili OnUserFunctionEx provjera smatra poznatima bez pozivanja rukovatelja, dok neregistrirani pozivi zadrže naziv svoje funkcije u Symbol
Strogi način vraća xlfeaReject za nepoznate funkcije ili imena; dodjela kroz uobičajeno svojstvo Formula ćelije odbija prije nego što se promijene vrijednost, predmemorija formula ili ovisnosti
Način očuvanja zadržava dijagnostiku i pohranjuje formulu kroz uobičajeni API ćelije; klasični XLS serializira nepoznati poziv kroz tokene BIFF korisničkih funkcija dodataka i zadržava tekst nepoznatog imena kroz spremanje, ponovno otvaranje i pretvorbu XLS/XLSX
Klasični XLS dodatno kompilira poznate formule kroz BIFF pisač i vraća xlfeiTargetFormatUnsupported kada se izraz ne može prikazati, dok XLSX prihvaća poznate moderne funkcije formula koje podržava njegov model formula
Provjera XLSX-a prepoznaje LAMBDA, leksički pozivne oblike LET, definirana imena koja upućuju na lambda funkcije, rezervirana mjesta izvještaja, registrirane vanjske veze radnih knjiga i valjane kvalificirane ili nekvalificirane strukturirane reference, uključujući ugniježđene oblike i oblike trenutačnog retka
Način kompatibilnosti može dodatno zadržati neriješene vanjske strukturirane reference za kasniju obradu, dok strogi način i dalje odbija neriješena imena tablica
Izračunavanje i masovna revizija
Očuvana nepoznata funkcija koja ostane neobrađena nakon prosljeđivanja lambda funkcijama i korisničkim funkcijama, ili očuvano nepoznato ime, izračunava se kao Variant pogreška s kôdom $1D, pogreška #NAME? programa Excel; ista tipizirana pogreška širi se kroz ovisne formule i kontekstualno izračunavanje
Poznate ugrađene funkcije bez implementacije ostaju razlikovne od nepoznatog poziva, dok registriranje, zamjena, uklanjanje ili pražnjenje korisničke funkcije u opsegu radne knjige ili procesa i promjena formule definiranog imena poništavaju zastarjelo stanje ovisnosti i izračunavanja
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSFormulaSymbolIssueKind = (xlfsiUnknownFunction, xlfsiUnknownName,
xlfsiSyntaxError);
TXLSFormulaSymbolLocationKind = (xlfslCell, xlfslDefinedName);
TXLSFormulaSymbolIssue = record
Kind: TXLSFormulaSymbolIssueKind;
LocationKind: TXLSFormulaSymbolLocationKind;
Sheet: Integer;
Row: Integer;
Col: Integer;
DefinedNameIndex: Integer;
DefinedName: WideString;
Formula: WideString;
Symbol: WideString;
end;
TXLSWorkbook i TXLSXWorkbook pružaju ista preopterećenja masovne revizije; svaki problem prepoznaje nepoznatu funkciju, nepoznato ime ili sintaksnu pogrešku zajedno s lokacijom ćelije radnog lista ili lokacijom definiranog imena, izvornom formulom i neriješenim simbolom
Revizija prolazi kroz raščlanjena stabla formula ili pohranjene tokene BIFF umjesto da pregledava tekst, pa tekst koji liči na funkciju unutar znakovnog niza ne prijavljuje se; kompilacija XLSX-a koristi predmemoriju lokalnu za operaciju s ključevima od razriješenog teksta formule, radnog lista, lokalnih postavki, generacije definiranih imena, generacija registra korisničkih funkcija i dostupnosti povratnih poziva
EntryCount izvještava o revidiranim formulama, UniqueFormulaCount o formulama kompiliranim ili pregledanim neovisno, a CacheHitCount o ponovljenim unosima opsluženima iz predmemorije operacije
Bez mutacija radnog lista
Provjera ne stvara niti uređuje ćeliju, ne mijenja predmemorirane vrijednosti, ne ažurira graf ovisnosti, ne označava radnu knjigu kao neažurnu i ne poziva registrirani rukovatelj korisničkih funkcija
Izravna provjera ostaje bez mutacija; uobičajena dodjela formule primjenjuje istu odluku iznutra i potvrđuje se tek nakon što uspiju provjera i priprema ciljnog formata
Primjer za Delphi
Policy := Workbook.FormulaEntryPolicy;
Policy.UnknownFunctionMode := xlfusmReject;
Policy.UnknownNameMode := xlfusmReject;
Workbook.FormulaEntryPolicy := Policy;
Validation := Sheet.ValidateFormulaEntry(4, 2, FormulaText);
if Validation.Action = xlfeaStoreFormula then
Sheet.Cells[4, 2].Formula := FormulaText;
Issues := Workbook.AuditFormulaSymbols(Stats);
for I := 0 to High(Issues) do
if Issues[I].Kind = xlfsiUnknownFunction then
LogUnknownSymbol(Issues[I].Symbol);
Vidi također