HotXLS-dokumentation

Princip för validering av formelinmatning

Classic XLS och XLSX exponerar samma biverkningsfria kontrakt för klassificering av formelinmatning innan den anropande ändrar en cell

Gemensam princip

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

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

property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Classic IXLSWorkbook och TXLSWorkbook exponerar egenskapen tillsammans med TXLSXWorkbook; XLSDefaultFormulaEntryPolicy tömmer tom inmatning och avvisar okända funktioner och okända definierade namn
Arbetsbokens egenskap kopieras efter värde och valideras atomärt vid tilldelning, så att ej stödda uppräkningsvärden utlöser EArgumentOutOfRangeException utan att den tidigare principen ändras

Valideringsresultat

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

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue skiljer mellan avsaknad av fel, okänd funktion, okänt namn, syntaxfel, begränsning i målformat och ogiltiga målkoordinater
Action väljer tömning av cell, lagring av sträng, lagring av formel eller avvisning, medan Symbol identifierar en okänd funktion eller ett okänt namn när något av dem har kännsts igen

Tom text och formler

Inmatning som är exakt tom returnerar xlfeaClearCell eller xlfeaStoreString enligt EmptyStringMode
En formel som returnerar en tom sträng, som ="", förblir en formel och returnerar xlfeaStoreFormula när målformatet kan representera den
Formeltexten kan innehålla eller utelämna ett inledande likhetstecken
Tilldelning av en exakt tom sträng via cellens normala Value -egenskap i Classic XLS eller XLSX tillämpar nu detta läge direkt: standarden tar bort varje befintligt värde eller formel, medan xlfesmPreserveString ersätter cellinnehållet med en konstant sträng vars längd är noll
Null och Unassigned tömmer alltid cellen i båda lägena, medan en verklig formel som ="" förblir en formel med ett oberoende lagrat eller beräknat resultat av en tom sträng
XLSX-rad- eller kolumnskrivare för string och Variant tillämpar samma regel utan att materialisera tömda hål och behåller den packade lagringen så länge de återstående värdena kan representeras där
Inbyggda XLS-, XLSX- och ODS-läsare samt XLS-to-XLSX- eller XLSX-to-XLS-omvandlare behandlar lagrade värden som betrott indata, så att en konstant tom sträng på filnivå överlever även när målarbetsboken behåller standardprincipen för användarinmatning

Okända symboler och målformat

Registrerade användarfunktioner på arbetsboks- eller processnivå och tilldelade OnUserFunction - eller OnUserFunctionEx -återanrop räknas som kända under valideringen utan att en hanterare anropas, medan oregistrerade anrop behåller sitt funktionsnamn i Symbol
Strikt läge returnerar xlfeaReject för okända funktioner eller namn; tilldelning via cellens normala Formula -egenskap avvisar innan värdet, formelcachen eller beroendena ändras
Bevarandeläget behåller diagnostiken och lagrar formeln via cellens normala API; Classic XLS serialiserar ett okänt anrop via BIFF-token för tilläggets användarfunktioner och behåller texten för det okända namnet genom sparande, återöppning och XLS/XLSX-konvertering
Classic XLS kompilerar dessutom kända formler via BIFF-skrivaren och returnerar xlfeiTargetFormatUnsupported när uttrycket inte kan representeras, medan XLSX accepterar kända moderna formelfunktioner som dess formelmodell stöder
XLSX-valideringen känner igen LAMBDA, lexikala anropsbara LET -former, definierade namn som hänvisar till lambdas, rapportplatshållare, registrerade externa arbetsbokslänkar och giltiga kvalificerade eller okvalificerade strukturerade referenser, inklusive kapslade former och former för den aktuella raden
Kompatibilitetsläget kan också behålla olösta externa strukturerade referenser för senare bearbetning, medan strikt läge fortfarande avvisar olösta tabellnamn

Beräkning och massgranskning

En bevarad okänd funktion som förblir obehandlad efter utskickning till lambdas och användarfunktioner, eller ett bevarat okänt namn, utvärderas som ett Variant-fel med koden $1D, Excels #NAME? -fel; samma typade fel fortplanter sig genom beroende formler och kontextuell utvärdering
Kända inbyggda funktioner utan implementering förblir åtskilda från ett okänt anrop, medan registrering, ersättning, borttagning eller tömning av en användarfunktion på arbetsboks- eller processnivå och ändring av ett definierat namns formel ogiltigförklarar inaktuellt beroende- och beräkningstillstånd
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 och TXLSXWorkbook tillhandahåller samma massgranskningsöverlagringar; varje problem identifierar en okänd funktion, ett okänt namn eller ett syntaxfel tillsammans med antingen en cellplacering i kalkylbladet eller en placering av ett definierat namn, källformeln och den olösta symbolenLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), källformeln och den olösta symbolen
Granskningen går igenom parsade formelträd eller lagrade BIFF-token i stället för att skanna text, så funktionsliknande text inuti en sträng rapporteras inte; XLSX-kompileringen använder en cache som är lokal för operationen, med nycklar av den lösta formeltexten, kalkylbladet, nationella inställningar, generationen av definierade namn, generationerna i användarfunktionsregistret och återanropens tillgänglighet
EntryCount rapporterar granskade formler, UniqueFormulaCount formler som kompilerats eller inspekterats oberoende, och CacheHitCount upprepade poster som serverats från operationens cache

Ingen mutation av kalkylbladet

Valideringen skapar eller redigerar inte en cell, ändrar inte cachade värden, uppdaterar inte beroendegrafen, markerar inte arbetsboken som ändrad och anropar inte en registrerad användarfunktionshanterare
Direkt validering förblir mutationsfri; normal formeltilldelning tillämpar samma beslut internt och genomförs först efter att validering och förberedelse av målformatet lyckats

Delphi-exempel

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

Se även

Sammanhangsberoende formelutvärdering
Excel-beräkningsmotor
Ytterligare klassiska XLS-API-medlemmar
Avancerade XLSX-API-medlemmar