Dokumentacja HotXLS

Zasady walidacji wprowadzania formuł

Klasyczny XLS i XLSX udostępniają tę samą umowę bez skutków ubocznych do klasyfikowania danych wejściowych formuł, zanim obiekt wywołujący zmieni komórkę

Zasady wspólne

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

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

property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Klasyczne IXLSWorkbook i TXLSWorkbook udostępniają tę właściwość razem z TXLSXWorkbook; XLSDefaultFormulaEntryPolicy czyści puste dane wejściowe i odrzuca nieznane funkcje oraz nieznane zdefiniowane nazwy
Właściwość skoroszytu jest kopiowana przez wartość i walidowana niepodzielnie podczas przypisania, więc nieobsługiwane wartości wyliczenia zgłaszają EArgumentOutOfRangeException bez zmiany poprzednich zasad

Wynik walidacji

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

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue rozróżnia brak błędu, nieznaną funkcję, nieznaną nazwę, błąd składni, ograniczenie formatu docelowego i nieprawidłowe współrzędne docelowe
Action wybiera wyczyszczenie komórki, zapisanie ciągu, zapisanie formuły lub odrzucenie, a Symbol identyfikuje nieznaną funkcję lub nazwę, gdy jedna z nich została rozpoznana

Pusty tekst i formuły

Dokładnie puste dane wejściowe zwracają xlfeaClearCell lub xlfeaStoreString zgodnie z EmptyStringMode
Formuła zwracająca pusty ciąg, na przykład ="", pozostaje formułą i zwraca xlfeaStoreFormula , jeśli format docelowy potrafi ją przedstawić
Tekst formuły może zawierać jeden początkowy znak równości lub go pomijać
Przypisanie dokładnie pustego ciągu za pomocą zwykłej właściwości Value komórki klasycznego XLS lub XLSX stosuje teraz ten tryb bezpośrednio: ustawienie domyślne usuwa wszelką istniejącą wartość lub formułę, a xlfesmPreserveString zastępuje zawartość komórki stałym ciągiem o długości zero
Null i Unassigned w obu trybach zawsze czyszczą komórkę, podczas gdy prawdziwa formuła, taka jak ="" , pozostaje formułą z niezależnie zapisanym lub obliczonym wynikiem w postaci pustego ciągu
Zapisujące wiersze lub kolumny ciągów i Variant w XLSX stosują tę samą regułę bez materializowania wyczyszczonych luk i zachowują spakowany magazyn, dopóki pozostałe wartości dają się w nim przedstawić
Natywne czytniki XLS, XLSX i ODS oraz konwertery XLS do XLSX i XLSX do XLS traktują zapisane wartości jako zaufane dane wejściowe, więc stały pusty ciąg na poziomie pliku przetrwa, nawet gdy skoroszyt docelowy zachowuje domyślne zasady wprowadzania przez użytkownika

Nieznane symbole i formaty docelowe

Zarejestrowane w zakresie skoroszytu lub procesu funkcje użytkownika i przypisane wywołania zwrotne OnUserFunction lub OnUserFunctionEx są w trakcie walidacji uważane za znane bez wywoływania procedury obsługi, podczas gdy niezarejestrowane wywołania zachowują nazwę funkcji w Symbol
Tryb rygorystyczny zwraca xlfeaReject dla nieznanych funkcji lub nazw; przypisanie za pomocą zwykłej właściwości Formula komórki odrzuca dane, zanim zmieni wartość, pamięć podręczną formuł lub zależności
Tryb zachowania utrzymuje diagnostykę i zapisuje formułę za pomocą zwykłego API komórek; klasyczny XLS serializuje nieznane wywołanie za pomocą tokenów funkcji użytkownika dodatków BIFF i zachowuje tekst nieznanych nazw podczas zapisywania, ponownego otwierania i konwersji XLS/XLSX
Klasyczny XLS dodatkowo kompiluje znane formuły przez moduł zapisujący BIFF i zwraca xlfeiTargetFormatUnsupported , gdy wyrażenia nie da się przedstawić, podczas gdy XLSX akceptuje znane nowoczesne funkcje formuł obsługiwane przez swój model formuł
Walidacja XLSX rozpoznaje LAMBDA, leksykalne wywoływalne elementy LET , zdefiniowane nazwy odwołujące się do lambd, symbole zastępcze raportów, zarejestrowane zewnętrzne łącza skoroszytów oraz prawidłowe kwalifikowane lub nekwalifikowane odwołania strukturalne, w tym formy zagnieżdżone i bieżącego wiersza
Tryb zgodności może także zachować nierozpoznane zewnętrzne odwołania strukturalne do późniejszego przetworzenia, podczas gdy tryb rygorystyczny nadal odrzuca nierozpoznane nazwy tabel

Obliczanie i audyt zbiorczy

Zachowana nieznana funkcja, która pozostaje nieobsłużona po przekierowaniu do lambd i funkcji użytkownika, albo zachowana nieznana nazwa jest wyliczana jako błąd Variant o kodzie $1D, czyli błąd Excela #NAME? ; ten sam błąd typowany rozprzestrzenia się przez formuły zależne i wyliczanie kontekstowe
Znane wbudowane funkcje, które nie są zaimplementowane, pozostają odróżnialne od nieznanego wywołania, a rejestrowanie, zastępowanie, usuwanie lub czyszczenie funkcji użytkownika w zakresie skoroszytu lub procesu oraz zmiana formuły zdefiniowanej nazwy unieważniają nieaktualny stan zależności i obliczeń
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 i TXLSXWorkbook zapewniają te same przeciążenia audytu zbiorczego; każdy problem identyfikuje nieznaną funkcję, nieznaną nazwę lub błąd składni wraz z lokalizacją komórki arkusza albo zdefiniowanej nazwy, formułą źródłową i nierozpoznanym symbolemLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), formułę źródłową i nierozpoznany symbol
Audyt przechodzi przez przeanalizowane drzewa formuł lub zapisane tokeny BIFF zamiast skanować tekst, więc tekst przypominający funkcję wewnątrz ciągu nie jest zgłaszany; kompilacja XLSX używa pamięci podręcznej lokalnej dla operacji, której klucz tworzą rozpoznany tekst formuły, arkusz, ustawienia regionalne, generacja zdefiniowanych nazw, generacje rejestrów funkcji użytkownika i dostępność wywołań zwrotnych
EntryCount raportuje poddane audytowi formuły, UniqueFormulaCount raportuje formuły skompilowane lub zbadane niezależnie, a CacheHitCount raportuje powtarzające się wpisy obsłużone przez pamięć podręczną operacji

Bez mutacji arkusza

Walidacja nie tworzy ani nie edytuje komórki, nie zmienia wartości w pamięci podręcznej, nie aktualizuje grafu zależności, nie oznacza skoroszytu jako zmodyfikowanego i nie wywołuje zarejestrowanej procedury obsługi funkcji użytkownika
Bezpośrednia walidacja pozostaje wolna od mutacji; zwykłe przypisanie formuły stosuje tę samą decyzję wewnętrznie i zatwierdza dopiero po pomyślnym zakończeniu walidacji i przygotowania formatu docelowego

Przykład dla Delphi

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

Zobacz także

Kontekstowe obliczanie formuł
Silnik obliczeniowy Excel
Dodatkowe elementy API klasycznego XLS
Zaawansowane elementy API XLSX