Dokumentacija HotXLS

Pravilnik provjere unosa formula

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

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