HotXLS-documentatie

Validatiebeleid voor formule-invoer

Klassieke XLS en XLSX bieden hetzelfde neveneffectvrije contract om formule-invoer te classificeren voordat een aanroeper een cel wijzigt

Gedeeld beleid

TXLSFormulaEmptyStringMode =
  (xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
  (xlfusmReject, xlfusmPreserve);

TXLSFormulaEntryPolicy = record
  EmptyStringMode: TXLSFormulaEmptyStringMode;
  UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
  UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;

property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Klassiek IXLSWorkbook en TXLSWorkbook bieden de eigenschap aan samen met TXLSXWorkbook; XLSDefaultFormulaEntryPolicy wist lege invoer en wijst onbekende functies en onbekende gedefinieerde namen af
De werkmapeigenschap wordt als waarde gekopieerd en atomair gevalideerd bij toewijzing, zodat niet-ondersteunde opsommingswaarden EArgumentOutOfRangeException veroorzaken zonder het vorige beleid te wijzigen

Validatieresultaat

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

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue onderscheidt geen fout, onbekende functie, onbekende naam, syntaxisfout, beperking van het doelformaat en ongeldige doelcoördinaten
Action kiest cel wissen, tekenreeks opslaan, formule opslaan of afwijzen, terwijl Symbol een onbekende functie of naam identificeert wanneer er een is herkend

Lege tekst en formules

Exact lege invoer geeft xlfeaClearCell of xlfeaStoreString terug, afhankelijk van EmptyStringMode
Een formule die een lege tekenreeks oplevert, zoals ="", blijft een formule en geeft xlfeaStoreFormula terug wanneer het doelformaat die kan weergeven
Formuletekst mag een voorafgaand gelijkheidsteken bevatten of weglaten
Het toewijzen van een exact lege tekenreeks via de normale klassieke XLS- of XLSX-celeigenschap Value past deze modus nu rechtstreeks toe: de standaardinstelling verwijdert elke bestaande waarde of formule, terwijl xlfesmPreserveString de celinhoud vervangt door een constante tekenreeks met lengte nul
Null en Unassigned wissen de cel altijd in beide modi, terwijl een echte formule zoals ="" een formule blijft met een onafhankelijk opgeslagen of berekend resultaat van een lege tekenreeks
XLSX-tekenreeks- en Variant-schrijvers voor rijen of kolommen passen dezelfde regel toe zonder gewiste gaten te materialiseren en behouden verpakte opslag zolang de resterende waarden daar representeerbaar zijn
Native XLS-, XLSX- en ODS-lezers en XLS-naar-XLSX- of XLSX-naar-XLS-converters behandelen opgeslagen waarden als vertrouwde invoer, zodat een bestandslokale constante lege tekenreeks behouden blijft, zelfs wanneer de doelwerkmap het standaardbeleid voor gebruikersinvoer aanhoudt

Onbekende symbolen en doelformaten

Geregistreerde werkmaplokale of procesbrede gebruikersfuncties en toegewezen OnUserFunction - of OnUserFunctionEx -callbacks gelden tijdens de validatie als bekend zonder een handler aan te roepen, terwijl niet-geregistreerde aanroepen hun functienaam in Symbol
Strikte modus geeft xlfeaReject terug voor onbekende functies of namen; toewijzing via de normale celeigenschap Formula wijst af voordat de waarde, de formulecache of afhankelijkheden worden gewijzigd
Behoudmodus houdt de diagnose vast en slaat de formule op via de normale cel-API; klassieke XLS serialiseert een onbekende aanroep via BIFF-add-in-gebruikersfunctietokens en behoudt tekst van onbekende namen bij opslaan, heropenen en XLS/XLSX-conversie
Klassieke XLS compileert bekende formules bovendien via de BIFF-writer en geeft xlfeiTargetFormatUnsupported terug wanneer de expressie niet kan worden weergegeven, terwijl XLSX bekende moderne formulefuncties accepteert die door zijn formulemodel worden ondersteund
XLSX-validatie herkent LAMBDA, lexicale LET -aanroepbare constructies, gedefinieerde namen die naar lambda's verwijzen, rapportplaatsaanduidingen, geregistreerde externe werkmaplinks en geldige bekwalificeerde of ongekwalificeerde gestructureerde verwijzingen, inclusief geneste vormen en vormen voor de huidige rij
Compatibiliteitsmodus kan ook onopgeloste externe gestructureerde verwijzingen vasthouden voor latere verwerking, terwijl strikte modus onopgeloste tabelnamen nog steeds afwijst

Berekening en bulkaudit

Een behouden onbekende functie die na dispatch naar lambda's en gebruikersfuncties onbehandeld blijft, of een behouden onbekende naam, evalueert tot een Variant-fout met code $1D, de Excel-fout #NAME? ; dezelfde getypeerde fout propageert door afhankelijke formules en contextuele evaluatie
Bekende ingebouwde functies die niet zijn geïmplementeerd blijven onderscheiden van een onbekende aanroep, terwijl het registreren, vervangen, verwijderen of wissen van een werkmaplokale of procesbrede gebruikersfunctie en het wijzigen van een formule met een gedefinieerde naam verouderde afhankelijkheids- en berekeningsstatus ongeldig maakt
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 en TXLSXWorkbook bieden dezelfde bulk-audit-overloads; elk probleem identificeert een onbekende functie, een onbekende naam of een syntaxfout, samen met ofwel een cellokatie op een werkblad (LocationKind = xlfslCell) ofwel de locatie van een gedefinieerde naam (LocationKind = xlfslDefinedName), de bronformule en het niet-herleide symbool
De audit doorloopt geparseerde formulebomen of opgeslagen BIFF-tokens in plaats van tekst te scannen, zodat functieachtige tekst binnen een tekenreeks niet wordt gerapporteerd; XLSX-compilatie gebruikt een operationele lokale cache met als sleutel opgeloste formuletekst, werkblad, landinstelling, generatie van gedefinieerde namen, generaties van gebruikersfunctieregisters en callback-beschikbaarheid
EntryCount rapporteert gecontroleerde formules, UniqueFormulaCount rapporteert onafhankelijk gecompileerde of geïnspecteerde formules en CacheHitCount rapporteert herhaalde items die door de operationcache werden geleverd

Geen werkbladmutatie

Validatie maakt of bewerkt geen cel, wijzigt geen gecachte waarden, werkt de afhankelijkheidsgraaf niet bij, markeert de werkmap niet als gewijzigd en roept geen geregistreerde gebruikersfunctiehandler aan
Directe validatie blijft vrij van mutaties; normale formuletoewijzing past dezelfde beslissing intern toe en legt alleen vast nadat validatie en voorbereiding van het doelformaat zijn geslaagd

Delphi-voorbeeld

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);

Zie ook

Contextuele formule-evaluatie
Excel-berekeningsengine
Extra klassieke XLS-API-leden
Geavanceerde XLSX-API-leden