Classic XLS og XLSX eksponerer den samme kontrakten uten bivirkninger for å klassifisere formelinndata før den som kaller endrer en celle
Felles policy
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Classic IXLSWorkbook og TXLSWorkbook eksponerer egenskapen sammen med TXLSXWorkbook; XLSDefaultFormulaEntryPolicy tømmer tomt inndata og avslår ukjente funksjoner og ukjente definerte navn
Arbeidsbokens egenskap kopieres etter verdi og valideres atomært ved tilordning, slik at ustøttede opplistingsverdier utløser EArgumentOutOfRangeException uten å endre den tidligere policyen
Valideringsresultat
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue skiller mellom fravær av feil, ukjent funksjon, ukjent navn, syntaksfeil, målformatbegrensning og ugyldige målkoordinater
Action velger tømming av celle, lagring av streng, lagring av formel eller avslag, mens Symbol identifiserer en ukjent funksjon eller et ukjent navn når et av dem er gjenkjent
Tom tekst og formler
Inndata som er nøyaktig tomt, returnerer xlfeaClearCell eller xlfeaStoreString i henhold til EmptyStringMode
En formel som returnerer en tom streng, som ="", forblir en formel og returnerer xlfeaStoreFormula når målformatet kan representere den
Formelteksten kan inneholde eller utelate ett ledende likhetstegn
Tilordning av en nøyaktig tom streng via cellens normale Value-egenskap i Classic XLS eller XLSX bruker nå denne modusen direkte: standarden fjerner enhver eksisterende verdi eller formel, mens xlfesmPreserveString erstatter celleinnholdet med en konstant streng hvis lengde er null
Null og Unassigned tømmer alltid cellen i begge modusene, mens en ekte formel som ="" forblir en formel med et uavhengig lagret eller beregnet resultat av en tom streng
XLSX-rad- eller kolonneskrivere for string og Variant bruker samme regel uten å materialisere tømte hull og beholder den pakkede lagringen så lenge de gjenværende verdiene kan representeres der
Innebygde XLS-, XLSX- og ODS-lesere og XLS-to-XLSX- eller XLSX-to-XLS-omformere behandler lagrede verdier som betrodd inndata, slik at en konstant tom streng på filnivå overlever selv når målarbeidsboken beholder standardpolicyen for brukerinndata
Ukjente symboler og målformater
Registrerte brukerfunksjoner på arbeidsbok- eller prosessnivå og tilordnede OnUserFunction- eller OnUserFunctionEx-tilbakekallinger regnes som kjente under valideringen uten å kalle en behandler, mens uregistrerte kall beholder funksjonsnavnet sitt i Symbol
Streng modus returnerer xlfeaReject for ukjente funksjoner eller navn; tilordning via cellens normale Formula-egenskap avslår før verdien, formelbufferen eller avhengighetene endres
Bevaringsmodus beholder diagnostikken og lagrer formelen via cellens normale API; Classic XLS serialiserer et ukjent kall via BIFF-tokens for brukerfunksjoner i tillegg og beholder teksten til det ukjente navnet gjennom lagring, gjenåpning og XLS/XLSX-konvertering
Classic XLS kompilerer i tillegg kjente formler via BIFF-skriveren og returnerer xlfeiTargetFormatUnsupported når uttrykket ikke kan representeres, mens XLSX godtar kjente moderne formelfunksjoner som formelmodellen dens støtter
XLSX-validering gjenkjenner LAMBDA, leksikale kallbare LET-former, definerte navn som henviser til lambdaer, rapportplassholdere, registrerte eksterne arbeidsbokkoblinger og gyldige kvalifiserte eller ukvalifiserte strukturerte referanser, inkludert nestede former og former for gjeldende rad
Kompatibilitetsmodus kan også beholde uoppløste eksterne strukturerte referanser til senere behandling, mens streng modus fortsatt avslår uoppløste tabellnavn
Beregning og massekontroll
En bevart ukjent funksjon som forblir ubehandlet etter utsendelse til lambdaer og brukerfunksjoner, eller et bevart ukjent navn, evalueres som en Variant-feil med koden $1D, Excels #NAME?-feil; samme typede feil forplanter seg gjennom avhengige formler og kontekstavhengig evaluering
Kjente innebygde funksjoner uten implementering forblir adskilt fra et ukjent kall, mens registrering, erstatning, fjerning eller tømming av en brukerfunksjon på arbeidsbok- eller prosessnivå og endring av et definert navns formel ugyldiggjør utdatert avhengighets- og beregningstilstand
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 og TXLSXWorkbook tilbyr de samme massekontrolloverbelastningene; hvert funn identifiserer en ukjent funksjon, et ukjent navn eller en syntaksfeil, sammen med enten en celleplassering på regnearket (LocationKind = xlfslCell) eller en plassering av et definert navn (LocationKind = xlfslDefinedName), kildeformelen og det uoppløste symbolet
Kontrollen går gjennom parsede formeltrær eller lagrede BIFF-tokens i stedet for å skanne tekst, slik at funksjonslignende tekst inne i en streng ikke rapporteres; XLSX-kompilering bruker en buffer som er lokal for operasjonen, med nøkler av den løste formelteksten, regnearket, nasjonale innstillinger, generasjonen av definerte navn, generasjonene i brukerfunksjonsregisteret og tilbakekallingenes tilgjengelighet
EntryCount rapporterer kontrollerte formler, UniqueFormulaCount formler som er kompilert eller inspisert uavhengig, og CacheHitCount gjentatte oppføringer som er levert fra operasjonens buffer
Ingen mutasjon av regnearket
Validering oppretter eller redigerer ikke en celle, endrer ikke bufrede verdier, oppdaterer ikke avhengighetsgrafen, merker ikke arbeidsboken som endret og kaller ikke en registrert brukerfunksjonsbehandler
Direkte validering forblir mutasjonsfri; normal formeltildeling bruker samme beslutning internt og gjennomføres først etter at validering og forberedelse av målformatet har lykkes
Delphi-eksempel
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 også