A klasszikus XLS és az XLSX ugyanazt a mellékhatásoktól mentes szerződést teszik elérhetővé a képletbeviteli szöveg osztályozására, mielőtt a hívó módosít egy cellát
Közös szabályzat
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
A klasszikus IXLSWorkbook és TXLSWorkbook a tulajdonságot a TXLSXWorkbook-mal együtt teszik elérhetővé; a XLSDefaultFormulaEntryPolicy törli az üres bevitelt, és elutasítja az ismeretlen függvényeket és ismeretlen definiált neveket
A munkafüzet tulajdonsága érték szerint másolódik, és hozzárendeléskor atomikusan érvényesül, így a nem támogatott felsorolási értékek EArgumentOutOfRangeException kivételt váltanak ki a korábbi szabályzat megváltoztatása nélkül
Érvényesítési eredmény
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
A Issue megkülönbözteti a hiba hiányát, az ismeretlen függvényt, az ismeretlen nevet, a szintaxishibát, a célformátum korlátozását és az érvénytelen célkoordinátákat
A Action kiválasztja a cella törlését, a karakterlánc tárolását, a képlet tárolását vagy az elutasítást, miközben a Symbol azonosítja az ismeretlen függvényt vagy nevet, ha valamelyiket felismerte
Üres szöveg és képletek
A pontosan üres beviteli vagy xlfeaClearCell, vagy xlfeaStoreString eredményt ad, az EmptyStringMode beállításától függően
Az üres karakterláncot visszaadó képlet, például a ="", képlet marad, és xlfeaStoreFormula értéket ad vissza, ha a célformátum képes azt ábrázolni
A képletszöveg tartalmazhat vagy elhagyhat egy vezető egyenlőségjelet
A pontosan üres karakterlánc hozzárendelése a klasszikus XLS vagy XLSX normál cella-Value tulajdonságán keresztül mostantól közvetlenül alkalmazza ezt a módot: az alapértelmezés eltávolít minden meglévő értéket vagy képletet, míg a xlfesmPreserveString nulla hosszúságú konstans karakterlánccal helyettesíti a cella tartalmát
A Null és a Unassigned mindkét módban mindig törli a cellát, míg az olyan valódi képlet, mint a ="", képlet marad, és függetlenül tárolt vagy kiszámított üres karakterlánc eredménnyel rendelkezik
Az XLSX karakterlánc- és Variant sor- vagy oszlopírói ugyanezt a szabályt alkalmazzák a törölt üregek anyagosítása nélkül, és a csomagolt tárolást megtartják, amíg a megmaradó értékek ott ábrázolhatók
A natív XLS, XLSX és ODS olvasók, valamint az XLS-ből XLSX-be vagy XLSX-ből XLS-be konvertálók megbízható bemenetként kezelik a tárolt értékeket, ezért a fájl szintű konstans üres karakterlánc akkor is fennmarad, ha a cél munkafüzet megtartja az alapértelmezett felhasználói beviteli szabályzatot
Ismeretlen szimbólumok és célformátumok
A munkafüzet- vagy folyamat szintű regisztrált felhasználói függvények és a hozzárendelt OnUserFunction vagy OnUserFunctionEx visszahívások érvényesítés közben ismertnek számítanak kezelő meghívása nélkül, míg a nem regisztrált hívások megtartják függvénynevüket a Symbol mezőben
A szigorú mód xlfeaReject értéket ad vissza ismeretlen függvények vagy nevek esetén; a normál cella-Formula tulajdonságon keresztüli hozzárendelés elutasít, mielőtt megváltoztatná az értéket, a képlet-gyorsítótárat vagy a függőségeket
A megőrző mód megtartja a diagnosztikát, és a normál cella-API-n keresztül tárolja a képletet; a klasszikus XLS a BIFF bővítmény felhasználói függvény tokeneken keresztül szerializálja az ismeretlen hívást, és mentéskor, újranyitáskor és XLS/XLSX konverziónál megtartja az ismeretlen nevek szövegét
A klasszikus XLS emellett a BIFF írón keresztül fordítja az ismert képleteket, és xlfeiTargetFormatUnsupported értéket ad vissza, ha a kifejezés nem ábrázolható, míg az XLSX elfogadja a képletmodellje által támogatott ismert modern képletfüggvényeket
Az XLSX-érvényesítés felismeri a LAMBDA-t, a lexikális LET hívható elemeket, a lambdákra hivatkozó definiált neveket, a jelentéshelyőrzőket, a regisztrált külső munkafüzet-hivatkozásokat, valamint az érvényes minősített vagy nem minősített strukturált hivatkozásokat, ideértve a beágyazott és az aktuális soros formákat is
A kompatibilitási mód a feloldatlan külső strukturált hivatkozásokat is megtarthatja későbbi feldolgozásra, míg a szigorú mód a feloldatlan táblaneveket továbbra is elutasítja
Számítás és tömeges audit
A megőrzött ismeretlen függvény, amely a lambda- és felhasználói függvény-diszpatch után is kezeletlen marad, vagy a megőrzött ismeretlen név Variant hibaként értékelődik ki $1D kóddal, azaz az Excel #NAME? hibájával; ugyanez a típusos hiba a függő képleteken és a kontextusfüggő kiértékelésen át terjed
A nem implementált ismert beépített függvények megkülönböztetve maradnak az ismeretlen hívástól, miközben a munkafüzet- vagy folyamat szintű felhasználói függvény regisztrálása, cseréje, eltávolítása vagy törlése és a definiált név képletének módosítása érvényteleníti az elavult függőségi és számítási állapotot
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;
A TXLSWorkbook és a TXLSXWorkbook ugyanazokat a tömeges audit túlterheléseket biztosítják; minden probléma azonosítja az ismeretlen függvényt, az ismeretlen nevet vagy a szintaxishibát, és feltünteti hozzá vagy a munkalapcella helyét (LocationKind = xlfslCell), vagy a definiált név helyét (LocationKind = xlfslDefinedName), továbbá a forrásképletet és a feloldatlan szimbólumot
Az audit az elemzett képletfákat vagy a tárolt BIFF tokeneket járja be szövegkeresés helyett, így a karakterláncon belüli függvényszerű szöveg nem kerül jelentésre; az XLSX-fordítás operációhelyi gyorsítótárat használ, amelynek kulcsát a feloldott képletszöveg, a munkalap, a területi beállítás, a definiált nevek generációja, a felhasználói függvénynyilvántartások generációi és a visszahívások elérhetősége alkotja
A EntryCount az auditált képleteket jelenti, a UniqueFormulaCount a függetlenül fordított vagy megvizsgált képleteket, a CacheHitCount pedig az operációs gyorsítótár által kiszolgált ismétlődő bejegyzéseket
Nincs munkalapmódosítás
Az érvényesítés nem hoz létre és nem szerkeszt cellát, nem módosítja a gyorsítótárazott értékeket, nem frissíti a függőségi gráfot, nem jelöli módosítottként a munkafüzetet, és nem hív meg regisztrált felhasználói függvénykezelőt
A közvetlen érvényesítés módosításmentes marad; a normál képlet-hozzárendelés belül ugyanazt a döntést alkalmazza, és csak az érvényesítés és a célformátum előkészítésének sikere után véglegesít
Delphi-példa
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);
Lásd még