HotXLS dokumentacija

Formulių įvedimo tikrinimo strategija

Klasikiniai XLS ir XLSX atskleidžia tą pačią be šalutinių poveikių sutartį formulių įvedimo klasifikavimui, kol skambintojas nepakeičia langelio

Bendra strategija

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

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

property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
Klasikiniai IXLSWorkbook ir TXLSWorkbook atskleidžia ypatybę kartu su TXLSXWorkbook; XLSDefaultFormulaEntryPolicy išvalo tuščią įvedimą ir atmeta nežinomas funkcijas bei nežinomus pavadintus vardus
Darbo knygos ypatybė nukopijuojama pagal reikšmę ir patikrinama atomariškai priskiriant, todėl nepalaikomos išvardijimo reikšmės iškelia EArgumentOutOfRangeException nepakeisdamos ankstesnės strategijos

Tikrinimo rezultatas

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

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue atskiria klaidos nebuvimą, nežinomą funkciją, nežinomą vardą, sintaksės klaidą, tikslinio formato apribojimą ir netinkamas tikslines koordinates
Action pasirenka langelio išvalymą, eilutės saugojimą, formulės saugojimą ar atmetimą, o Symbol identifikuoja nežinomą funkciją ar vardą, kai vienas iš jų buvo atpažintas

Tuščias tekstas ir formulės

Tiksliai tuščias įvedimas grąžina xlfeaClearCell arba xlfeaStoreString pagal EmptyStringMode
Formulė, grąžinanti tuščią eilutę, pavyzdžiui ="", lieka formule ir grąžina xlfeaStoreFormula , kai tikslinis formatas gali ją pavaizduoti
Formulės tekstas gali turėti arba praleisti vieną pradinį lygybės ženklą
Tiksliai tuščios eilutės priskyrimas per įprastą klasikinio XLS ar XLSX langelio Value ypatybę dabar tiesiogiai taiko šį režimą: numatytoji reikšmė pašalina bet kokią esamą reikšmę ar formulę, o xlfesmPreserveString pakeičia langelio turinį pastovia eilute, kurios ilgis nulinis
Null ir Unassigned visada išvalo langelį abiem režimais, o tikra formulė, tokia kaip ="" , lieka formule su nepriklausomai saugoma ar skaičiuojama tuščios eilutės reikšme
XLSX eilučių ir Variant eilučių ar stulpelių rašytojai taiko tą pačią taisyklę neišryškindami išvalytų tuščių vietų ir išlaiko paketinę saugyklą, kol likusios reikšmės ten gali būti pavaizduotos
Savos XLS, XLSX ir ODS skaitytuvės bei XLS-to-XLSX ar XLSX-to-XLS keitiklai saugomas reikšmes laiko patikimu įvedimu, todėl failo lygio pastovi tuščia eilutė išlieka net tada, kai paskirties darbo knyga palieka numatytąją naudotojo įvedimo strategiją

Nežinomi simboliai ir tiksliniai formatai

Užregistruotos darbo knygos ar proceso lygio naudotojo funkcijos ir priskirti OnUserFunction ar OnUserFunctionEx atgaliniai iškvietimai tikrinimo metu laikomi žinomais, nekviesdami jokio apdorotojo, o neregistruoti iškvietimai savo funkcijos vardą palieka Symbol
Griežtas režimas nežinomoms funkcijoms ar vardams grąžina xlfeaReject ; priskyrimas per įprastą langelio Formula ypatybę atmeta prieš keičiant reikšmę, formulių talpyklą ar priklausomybes
Išsaugojimo režimas pasilieka diagnostiką ir išsaugo formulę per įprastą langelio API; klasikinis XLS nežinomą iškvietimą serializuoja per BIFF priedų naudotojo funkcijų žetonus ir nežinomo vardo tekstą išlaiko per įrašymą, pakartotinį atvėrimą ir XLS/XLSX konvertavimą
Klasikinis XLS papildomai sukompiliuoja žinomas formules per BIFF rašytoją ir grąžina xlfeiTargetFormatUnsupported , kai išraiškos negalima pavaizduoti, o XLSX priima žinomas modernias formulių funkcijas, kurias palaiko jo formulių modelis
XLSX tikrinimas atpažįsta LAMBDA, leksinius LET iškviečiamuosius, į lambdas nurodančius pavadintus vardus, ataskaitų vietos rezervavimo žymes, užregistruotas išorines darbo knygos nuorodas ir tinkamas kvalifikuotas ar nekvalifikuotas struktūrines nuorodas, įskaitant įdėtąsias ir einamosios eilutės formas
Suderinamumo režimas taip pat gali palikti neišspręstas išorines struktūrines nuorodas vėlesniam apdorojimui, o griežtas režimas ir toliau atmeta neišspręstus lentelių vardus

Skaičiavimas ir masinis auditas

Išsaugota nežinoma funkcija, likusi neapdorota po lambda ir naudotojo funkcijų perskyrimo, arba išsaugotas nežinomas vardas vertinamas kaip Variant klaida su kodu $1D, Excel klaida #NAME? ; ta pati tipizuota klaida plinta per priklausomas formules ir kontekstinį vertinimą
Žinomos neįgyvendintosios integruotosios funkcijos lieka atskiriamos nuo nežinomo iškvietimo, o naudotojo funkcijos darbo knygos ar proceso lygiu užregistravimas, pakeitimas, pašalinimas ar išvalymas ir pavadinto vardo formulės keitimas panaikina pasenusią priklausomybių ir skaičiavimo būseną
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 ir TXLSXWorkbook pateikia tuos pačius masinio audito perrašymus; kiekviena problema identifikuoja nežinomą funkciją, nežinomą vardą ar sintaksės klaidą kartu su darbalapio langelio vieta arba pavadinto vardo vieta, šaltinio formule ir neišspręstu simboliuLocationKind = xlfslCell) or a defined-name location (LocationKind = xlfslDefinedName), šaltinio formulę ir neišspręstą simbolį
Auditas pereina per išanalizuotus formulių medžius ar saugomus BIFF žetonus vietoj teksto skenavimo, todėl eilutės viduje esantis funkcinis tekstas nepranešamas; XLSX kompiliavimas naudoja operacijai būdingą talpyklą, kurios raktai yra išspręstas formulės tekstas, darbalapis, lokalės, pavadintų vardų karta, naudotojo funkcijų registro kartos ir atgalinių iškvietimų prieinamumas
EntryCount praneša patikrintas formules, UniqueFormulaCount — atskirai sukompiliuotas ar apžiūrėtas formules, o CacheHitCount — pakartotinius įrašus, patiektus iš operacijos talpyklos

Jokių darbalapio mutacijų

Tikrinimas nesukuria ir neredaguoja langelio, nekeičia talpykloje esančių reikšmių, neatnaujina priklausomybių grafo, nepažymi darbo knygos kaip neįrašytos ir nekviečia užregistruoto naudotojo funkcijos apdorotojo
Tiesioginis tikrinimas lieka be mutacijų; įprastas formulės priskyrimas viduje taiko tą patį sprendimą ir įvykdomas tik po sėkmingo tikrinimo ir tikslinio formato paruošimo

Delphi pavyzdys

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

Taip pat žiūrėkite

Kontekstinis formulių vertinimas
Excel skaičiavimo variklis
Papildomi klasikinio XLS API nariai
Išplėstiniai XLSX API nariai