Класическите 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 на клетката в Classic XLS или XLSX вече прилага този режим директно: по подразбиране се премахва всяка съществуваща стойност или формула, докато xlfesmPreserveString замества съдържанието на клетката с константен низ с дължина нула
Null и Unassigned винаги изчистват клетката в двата режима, докато истинска формула като ="" остава формула с независимо съхраняван или изчисляван резултат празен низ
XLSX писачките за редове или колони на низове и Variant прилагат същото правило, без да материалзират изчистените празни места, и запазват пакетизираното съхранение, докато останалите стойности са представими там
Вградените четци на XLS, XLSX и ODS и конверторите XLS-to-XLSX или XLSX-to-XLS третират съхранените стойности като надежден вход, така че константен празен низ на файлово ниво оцелява дори когато работната книга-получател запазва политиката по подразбиране за потребителски вход
Неизвестни символи и целеви формати
Регистрираните потребителски функции в обхват на работната книга или на процеса и зададените обратни извиквания OnUserFunction или OnUserFunctionEx се броят за известни по време на валидацията без извикване на обработчик, докато нерегистрираните извиквания запазват името на функцията си в Symbol
Строгият режим връща xlfeaReject за неизвестни функции или имена; задаването чрез нормалното свойство Formula на клетката отхвърля, преди да са променени стойността, кешът на формулите или зависимостите
Режимът на запазване задържа диагностиката и съхранява формулата чрез нормалния API на клетката; Classic XLS сериализира неизвестно извикване чрез BIFF токени на потребителски функции на добавки и запазва текста на неизвестно име през записване, повторно отваряне и конверсия XLS/XLSX
Classic XLS допълнително компилира известните формули чрез BIFF писача и връща xlfeiTargetFormatUnsupported, когато изразът не може да бъде представен, докато XLSX приема известните модерни функции от формулния модел
Валидацията в XLSX разпознава LAMBDA, лексикално извикваемите LET, дефинирани имена, които сочат към лямбда, заместители в отчети, регистрирани външни връзки към работни книги и валидни квалифицирани или неквалифицирани структурни препратки, включително вложени и за текущия ред
Режимът на съвместимост може също да задържи неразрешени външни структурни препратки за по-късна обработка, докато строгият режим продължава да отхвърля неразрешени имена на таблици
Изчисляване и масова проверка
Запазена неизвестна функция, която остане необработена след разпределението към лямбда и потребителски функции, или запазено неизвестно име, се изчислява като Variant грешка с код $1D — грешката #NAME? на Excel; същата типизирана грешка се разпространява през зависимите формули и контекстното изчисляване
Известните вградени функции без реализация остават различими от неизвестно извикване, докато регистрирането, замяната, премахването или изчистването на потребителска функция в обхват на работна книга или на процес и промяната на формула на дефинирано име инвалидира остарялото състояние на зависимостите и изчислението
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
out AStats: TXLSFormulaSymbolAuditStats):
TXLSFormulaSymbolIssues; overload;
TXLSWorkbook и TXLSXWorkbook предоставят същите претоварвания за масова проверка; всеки проблем идентифицира неизвестна функция, неизвестно име или синтактична грешка заедно с местоположение на клетка от работен лист или местоположение на дефинирано име, изходната формула и неразрешения символ
Проверката обхожда анализирани дървета от формули или съхранени 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);
Вижте също