Dokumentacija HotXLS

Pravilo validacije unosa formula

Klasični XLS i XLSX izlažu isti ugovor bez bočnih efekata za klasifikaciju unosa formule pre nego što pozivalac promeni ćeliju

Zajedničko pravilo

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 sa TXLSXWorkbook; XLSDefaultFormulaEntryPolicy isprazni prazan unos i odbije nepoznate funkcije i nepoznata definisana imena
Svojstvo radne sveske kopira se po vrednosti i validira atomarno pri dodeli, pa nepodržane vrednosti nabrajanja podižu EArgumentOutOfRangeException bez promene prethodnog pravila

Rezultat validacije

function ValidateFormulaEntry(Row, Col: Integer;
  const Formula: WideString): TXLSFormulaEntryValidationResult;

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue razlikuje odsustvo greške, nepoznatu funkciju, nepoznato ime, sintaksnu grešku, ograničenje ciljnog formata i nevažeće ciljne koordinate
Action bira pražnjenje ćelije, čuvanje stringa, čuvanje formule ili odbijanje, dok Symbol identifikuje nepoznatu funkciju ili ime kada je neko bilo prepoznato

Prazan tekst i formule

Unos koji je tačno prazan vraća xlfeaClearCell ili xlfeaStoreString prema EmptyStringMode
Formula koja vraća prazan string, poput ="", ostaje formula i vraća xlfeaStoreFormula kada ciljni format ume da je prikaže
Tekst formule može sadržati ili izostaviti jedan vodeći znak jednakosti
Dodela tačno praznog stringa preko uobičajenog svojstva Value ćelije u klasičnom XLS-u ili XLSX-u sada direktno primenjuje ovaj režim: podrazumevano se uklanja svaka postojeća vrednost ili formula, dok xlfesmPreserveString zamenjuje sadržaj ćelije konstantnim stringom čija je dužina nula
Null i Unassigned uvek isprazne ćeliju u oba režima, dok prava formula poput ="" ostaje formula sa nezavisno sačuvanim ili izračunatim rezultatom praznog stringa
Pisači redova ili kolona XLSX-a za string i Variant primenjuju isto pravilo bez materijalizovanja ispražnjenih praznina i zadržavaju pakovano skladištenje dok god preostale vrednosti mogu da se prikažu u njemu
Izvorni čitači XLS, XLSX i ODS i konvertori XLS-to-XLSX ili XLSX-to-XLS tretiraju sačuvane vrednosti kao pouzdan unos, pa konstanta praznog stringa na nivou datoteke preživi i kada odredišna radna sveska zadrži podrazumevano pravilo korisničkog unosa

Nepoznati simboli i ciljni formati

Registrovane korisničke funkcije u obimu radne sveske ili procesa i dodeljeni povratni pozivi OnUserFunction ili OnUserFunctionEx validacija smatra poznatima bez pozivanja rukovaoca, dok neregistrovani pozivi zadrže naziv svoje funkcije u Symbol
Strogi režim vraća xlfeaReject za nepoznate funkcije ili imena; dodela preko uobičajenog svojstva Formula ćelije odbija pre nego što se promene vrednost, keš formula ili zavisnosti
Režim očuvanja zadržava dijagnostiku i čuva formulu preko uobičajenog API-ja ćelije; klasični XLS serijalizuje nepoznati poziv preko tokena BIFF korisničkih funkcija dodataka i zadržava tekst nepoznatog imena kroz čuvanje, ponovno otvaranje i konverziju XLS/XLSX
Klasični XLS dodatno kompajlira poznate formule preko BIFF pisača i vraća xlfeiTargetFormatUnsupported kada se izraz ne može prikazati, dok XLSX prihvata poznate moderne funkcije formula koje podržava njegov model formula
Validacija XLSX-a prepoznaje LAMBDA, leksički pozivne oblike LET , definisana imena koja upućuju na lambda funkcije, rezervisana mesta izveštaja, registrovane spoljne veze radnih sveski i važeće kvalifikovane ili nekvalifikovane strukturisane reference, uključujući ugnježđene oblike i oblike tekućeg reda
Režim kompatibilnosti može dodatno da zadrži nerešene spoljne strukturisane reference za kasniju obradu, dok strogi režim i dalje odbija nerešena imena tabela

Izračunavanje i masovna revizija

Očuvana nepoznata funkcija koja ostane neobrađena nakon prosleđivanja lambda i korisničkim funkcijama, ili očuvano nepoznato ime, izračunava se kao Variant greška sa kodom $1D, greška #NAME? programa Excel; ista tipizirana greška širi se kroz zavisne formule i kontekstualno izračunavanje
Poznate ugrađene funkcije bez implementacije ostaju različite od nepoznatog poziva, dok registrovanje, zamena, uklanjanje ili pražnjenje korisničke funkcije u obimu radne sveske ili procesa i promena formule definisanog imena poništavaju zastarelo stanje zavisnosti 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 identifikuje nepoznatu funkciju, nepoznato ime ili sintaksnu grešku zajedno sa lokacijom ćelije radnog lista ili lokacijom definisanog imena, izvornom formulom i nerešenim simbolomLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), izvornu formulu i nerešen simbol
Revizija prelazi preko raščlanjenih stabala formula ili sačuvanih tokena BIFF umesto da pregleda tekst, pa tekst koji liči na funkciju unutar stringa ne prijavljuje se; kompajliranje XLSX-a koristi keš u okviru operacije sa ključevima od rešenog teksta formule, radnog lista, lokalnih podešavanja, generacije definisanih imena, generacija registra korisničkih funkcija i dostupnosti povratnih poziva
EntryCount izveštava o revidiranim formulama, UniqueFormulaCount o formulama kompajliranim ili pregledanim nezavisno, a CacheHitCount o ponovljenim unosima opsluženim iz keša operacije

Bez mutacije radnog lista

Validacija ne stvara niti uređuje ćeliju, ne menja keširane vrednosti, ne ažurira graf zavisnosti, ne označava radnu svesku kao neažurnu i ne poziva registrovanog rukovaoca korisničkih funkcija
Direktna validacija ostaje bez mutacija; uobičajena dodela formule primenjuje istu odluku iznutra i potvrđuje se tek nakon što uspeju validacija i priprema ciljnog formata

Primer 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đe

Kontekstualno izračunavanje formula
Pogon za proračune programa Excel
Dodatni klasični XLS API članovi
Napredni XLSX API članovi