Classic XLS und XLSX legen denselben nebeneffektfreien Vertrag offen, um Formeleingaben zu klassifizieren, bevor ein Aufrufer eine Zelle verändert
Gemeinsame Richtlinie
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Klassisches IXLSWorkbook und TXLSWorkbook legen die Eigenschaft gemeinsam mit TXLSXWorkbookoffen; XLSDefaultFormulaEntryPolicy leert leere Eingaben und weist unbekannte Funktionen und unbekannte definierte Namen zurück
Die Arbeitsmappeneigenschaft wird als Wert kopiert und beim Zuweisen atomar validiert, sodass nicht unterstützte Aufzählungswerte EArgumentOutOfRangeException auslösen, ohne die vorherige Richtlinie zu verändern
Validierungsergebnis
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue unterscheidet keinen Fehler, unbekannte Funktion, unbekannten Namen, Syntaxfehler, Einschränkung des Zielformats und ungültige Zielkoordinaten
Action wählt Zelle leeren, Zeichenfolge speichern, Formel speichern oder zurückweisen, während Symbol eine unbekannte Funktion oder einen unbekannten Namen bezeichnet, wenn einer erkannt wurde
Leerer Text und Formeln
Genaue leere Eingabe gibt je nach xlfeaClearCell entweder xlfeaStoreString oder EmptyStringMode
Eine Formel, die eine leere Zeichenfolge zurückgibt, etwa ="", bleibt eine Formel und gibt xlfeaStoreFormula zurück, wenn das Zielformat sie darstellen kann
Formeltext darf ein führendes Gleichheitszeichen enthalten oder weglassen
Das Zuweisen einer exakt leeren Zeichenfolge über die normale Classic-XLS- oder XLSX-Zelleneigenschaft Value wendet diesen Modus nun direkt an: Der Standard entfernt jeden vorhandenen Wert oder jede Formel, während xlfesmPreserveString den Zellinhalt durch eine konstante Zeichenfolge mit der Länge null ersetzt
Null und Unassigned leeren die Zelle in beiden Modi stets, während eine echte Formel wie ="" eine Formel mit einem unabhängig gespeicherten oder berechneten Leerzeichenergebnis bleibt
XLSX-Zeichenfolgen- und Variant-Schreiber für Zeilen oder Spalten wenden dieselbe Regel an, ohne geleerte Lücken zu materialisieren, und behalten gepackte Speicherung bei, wenn die verbleibenden Werte dort darstellbar sind
Native XLS-, XLSX- und ODS-Reader sowie XLS-nach-XLSX- oder XLSX-nach-XLS-Konverter behandeln gespeicherte Werte als vertrauenswürdige Eingaben, sodass eine dateilokale konstante leere Zeichenfolge erhalten bleibt, selbst wenn die Zielarbeitsmappe die Standardrichtlinie für Benutzereingaben beibehält
Unbekannte Symbole und Zielformate
Registrierte arbeitsmappenlokale oder prozessweite Benutzerfunktionen und zugewiesene OnUserFunction - oder OnUserFunctionEx -Rückrufe gelten während der Validierung als bekannt, ohne einen Handler aufzurufen, während nicht registrierte Aufrufe ihren Funktionsnamen in Symbol
Der strenge Modus gibt für unbekannte Funktionen oder Namen xlfeaReject zurück; das Zuweisen über die normale Zelleneigenschaft Formula weist zurück, bevor Wert, Formelcache oder Abhängigkeiten verändert werden
Der Bewahrungsmodus behält die Diagnose bei und speichert die Formel über die normale Zellen-API; Classic XLS serialisiert einen unbekannten Aufruf über BIFF-Add-in-Benutzerfunktionstoken und behält unbekannte Namenstexte über Speichern, erneutes Öffnen und XLS/XLSX-Konvertierung hinweg bei
Classic XLS kompiliert bekannte Formeln zusätzlich durch den BIFF-Writer und gibt xlfeiTargetFormatUnsupported zurück, wenn der Ausdruck nicht dargestellt werden kann, während XLSX bekannte moderne Formelfunktionen akzeptiert, die von seinem Formelmodell unterstützt werden
Die XLSX-Validierung erkennt LAMBDA, lexikalische LET -Aufrufbare, definierte Namen, die auf Lambdas verweisen, Berichtsplatzhalter, registrierte externe Arbeitsmappenlinks sowie gültige qualifizierte oder nicht qualifizierte strukturierte Bezüge einschließlich verschachtelter und aktueller Zeilenformen
Der Kompatibilitätsmodus kann auch unaufgelöste externe strukturierte Bezüge für eine spätere Verarbeitung beibehalten, während der strenge Modus unaufgelöste Tabellennamen weiterhin zurückweist
Berechnung und Sammelaudit
Eine bewahrte unbekannte Funktion, die nach dem Lambda- und Benutzerfunktions-Dispatch unbehandelt bleibt, oder ein bewahrter unbekannter Name wird als Variant-Fehler mit dem Code $1Dausgewertet, der Excel- #NAME? -Fehler; derselbe typisierte Fehler pflanzt sich durch abhängige Formeln und kontextbezogene Auswertung fort
Bekannte eingebaute Funktionen, die nicht implementiert sind, bleiben von einem unbekannten Aufruf unterscheidbar, während Registrieren, Ersetzen, Entfernen oder Leeren einer arbeitsmappenlokalen oder prozessweiten Benutzerfunktion und das Ändern einer Formel mit definiertem Namen veraltete Abhängigkeits- und Berechnungszustände ungültig macht
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 and TXLSXWorkbook bieten dieselben Sammelaudit-Overloads; jedes Problem identifiziert eine unbekannte Funktion, einen unbekannten Namen oder einen Syntaxfehler zusammen mit entweder einer Arbeitsblattzellenposition (LocationKind = xlfslCellundLocationKind = xlfslDefinedNamebieten dieselben Sammelaudit-Überladungen; jedes Problem identifiziert eine unbekannte Funktion, einen unbekannten Namen oder einen Syntaxfehler zusammen mit entweder einer Arbeitsblattzellenposition oder einer Position eines definierten Namens, der Quellformel und dem unaufgelösten Symbol
Das Audit durchläuft geparste Formelbäume oder gespeicherte BIFF-Token, statt Text zu durchsuchen, sodass funktionsähnlicher Text innerhalb einer Zeichenfolge nicht gemeldet wird; die XLSX-Kompilierung verwendet einen operationslokalen Cache, der aufgelöstem Formeltext, Arbeitsblatt, Gebietsschema, Generation definierter Namen, Generationen von Benutzerfunktionsregistrierungen und Rückrufverfügbarkeit zugeordnet ist
EntryCount meldet geprüfte Formeln, UniqueFormulaCount meldet unabhängig kompilierte oder inspizierte Formeln und CacheHitCount meldet wiederholte Einträge, die vom Operationscache bedient wurden
Keine Arbeitsblattmutation
Die Validierung erzeugt oder bearbeitet keine Zelle, verändert keine zwischengespeicherten Werte, aktualisiert nicht den Abhängigkeitsgraphen, markiert die Arbeitsmappe nicht als geändert und ruft keinen registrierten Benutzerfunktions-Handler auf
Die direkte Validierung bleibt mutationsfrei; die normale Formelzuweisung wendet dieselbe Entscheidung intern an und schreibt nur fest, nachdem Validierung und Zielformatvorbereitung erfolgreich waren
Delphi-Beispiel
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);Siehe auch