HotXLS dokumentáció

Képletbeviteli érvényesítési szabályzat

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

Kontextusfüggő képletkiértékelés
Excel számítási motor
További klasszikus XLS API tagok
Speciális XLSX API-tagok