Классический XLS и XLSX предоставляют одинаковый контракт без побочных эффектов для классификации ввода формул до того, как вызывающая сторона изменит ячейку
Общая политика
TXLSFormulaEmptyStringMode =
(xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
(xlfusmReject, xlfusmPreserve);
TXLSFormulaEntryPolicy = record
EmptyStringMode: TXLSFormulaEmptyStringMode;
UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;
property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Классические IXLSWorkbook и TXLSWorkbook предоставляют свойство вместе с TXLSXWorkbook; XLSDefaultFormulaEntryPolicy очищает пустой ввод и отклоняет неизвестные функции и неизвестные определенные имена
Свойство книги копируется по значению и атомарно проверяется при присваивании, поэтому неподдерживаемые значения перечисления вызывают EArgumentOutOfRangeException , не изменяя предыдущую политику
Результат проверки
function ValidateFormulaEntry(Row, Col: Integer;
const Formula: WideString): TXLSFormulaEntryValidationResult;
TXLSFormulaEntryValidationResult = record
Issue: TXLSFormulaEntryIssue;
Action: TXLSFormulaEntryAction;
Symbol: WideString;
end;
Issue различает отсутствие ошибки, неизвестную функцию, неизвестное имя, синтаксическую ошибку, ограничение целевого формата и недопустимые целевые координаты
Action выбирает очистку ячейки, сохранение строки, сохранение формулы или отклонение, а Symbol идентифицирует неизвестную функцию или имя, если одно из них было распознано
Пустой текст и формулы
Точно пустой ввод возвращает xlfeaClearCell или xlfeaStoreString в соответствии с EmptyStringMode
Формула, возвращающая пустую строку, например ="", остается формулой и возвращает xlfeaStoreFormula , если целевой формат может ее представить
Текст формулы может содержать или опускать один начальный знак равенства
Присваивание точно пустой строки через обычное свойство Value ячейки классического XLS или XLSX теперь применяет этот режим напрямую: значение по умолчанию удаляет любое существующее значение или формулу, а xlfesmPreserveString заменяет содержимое ячейки постоянной строкой нулевой длины
Null и Unassigned в любом режиме всегда очищают ячейку, тогда как настоящая формула, такая как ="" , остается формулой с независимо сохраненным или вычисленным результатом в виде пустой строки
Средства записи строк и Variant для строк или столбцов XLSX применяют то же правило, не материализуя очищенные пустоты, и сохраняют упакованное хранилище, пока оставшиеся значения представимы в нем
Собственные средства чтения XLS, XLSX и ODS, а также конвертеры XLS в XLSX и XLSX в XLS обрабатывают сохраненные значения как доверенный ввод, поэтому константа пустой строки на уровне файла сохраняется, даже если книга назначения сохраняет политику пользовательского ввода по умолчанию
Неизвестные символы и целевые форматы
Зарегистрированные на уровне книги или процесса пользовательские функции и назначенные обратные вызовы OnUserFunction или OnUserFunctionEx считаются известными во время проверки без вызова обработчика, а незарегистрированные вызовы сохраняют имя функции в Symbol
Строгий режим возвращает xlfeaReject для неизвестных функций или имен; присваивание через обычное свойство Formula ячейки отклоняет ввод до изменения значения, кэша формул или зависимостей
Режим сохранения удерживает диагностику и сохраняет формулу через обычный API ячеек; классический XLS сериализует неизвестный вызов через токены пользовательских функций надстроек BIFF и сохраняет текст неизвестных имен при сохранении, повторном открытии и преобразовании XLS/XLSX
Классический XLS дополнительно компилирует известные формулы через модуль записи BIFF и возвращает xlfeiTargetFormatUnsupported , когда выражение не может быть представлено, тогда как XLSX принимает известные современные функции формул, поддерживаемые его моделью формул
Проверка XLSX распознает LAMBDA, лексические вызываемые элементы LET , определенные имена, ссылающиеся на лямбды, заполнители отчетов, зарегистрированные внешние ссылки на книги и допустимые квалифицированные или неквалифицированные структурированные ссылки, включая вложенные формы и формы текущей строки
Режим совместимости может также удерживать неразрешенные внешние структурированные ссылки для последующей обработки, тогда как строгий режим по-прежнему отклоняет неразрешенные имена таблиц
Вычисления и массовый аудит
Сохраненная неизвестная функция, оставшаяся необработанной после диспетчеризации лямбд и пользовательских функций, или сохраненное неизвестное имя вычисляется как ошибка Variant с кодом $1D— ошибкой Excel #NAME? ; та же типизированная ошибка распространяется через зависимые формулы и контекстное вычисление
Известные встроенные функции без реализации остаются отличимыми от неизвестного вызова, а регистрация, замена, удаление или очистка пользовательской функции на уровне книги или процесса и изменение формулы определенного имени делают недействительными устаревшее состояние зависимостей и вычислений
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 и TXLSXWorkbook предоставляют одинаковые перегрузки массового аудита; каждая проблема идентифицирует неизвестную функцию, неизвестное имя или синтаксическую ошибку вместе с расположением ячейки листа или определенного имени, исходной формулой и неразрешенным символомLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), исходную формулу и неразрешённый символ
Аудит обходит разобранные деревья формул или сохраненные токены BIFF вместо сканирования текста, поэтому похожий на функцию текст внутри строки не сообщается; компиляция XLSX использует локальный для операции кэш, ключ которого составляют разрешенный текст формулы, лист, языковой стандарт, поколение определенных имен, поколения реестров пользовательских функций и доступность обратных вызовов
EntryCount сообщает число проверенных формул, UniqueFormulaCount — число независимо скомпилированных или проверенных формул, а CacheHitCount — число повторных записей, обслуженных кэшем операции
Без изменения листа
Проверка не создает и не изменяет ячейку, не меняет кэшированные значения, не обновляет граф зависимостей, не помечает книгу как измененную и не вызывает зарегистрированный обработчик пользовательской функции
Прямая проверка остается свободной от изменений; обычное присваивание формулы применяет то же решение внутри и фиксирует результат только после успешного завершения проверки и подготовки целевого формата
Пример для 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);См. также