HotXLS ドキュメント

数式トークンとユーザー関数

HotXLS は、両方のワークブック エンジンでロスレスの検査と保護された書き戻しのための呼び出し側所有の数式トークン ストリームと、カスタム計算のための階層的なユーザー関数レジストリを公開します

トークン モデル

TXLSFormulaTokenClass、TXLSFormulaTokenKind、および TXLSFormulaTokenSource は、各 TXLSFormulaToken を分類し、解析されたテキスト、クラシック BIFF バイト、またはその他のサポートされているソースのいずれから取得されたかを記録します

TXLSFormulaTokenKind、Opcode、BaseOpcode、TokenClass、RawBytes、TextValue、NumberValue、IntegerValue、ArgumentCount、FunctionIndex、ExternSheetIndex、Row1、Col1、Row2、Col2、Row1Relative、Col1Relative、Row2Relative、Col2Relative、ReferenceUsesOffsets、Supported、ArrayRows、ArrayCols、ArrayValueCount、および ArrayValues
TXLSFormulaTokenStreamDecodeBiff、Clone、CloneSyntaxTree、BindContext、CanCompileFor、CanWriteBiffAt、ReplaceReference、Count、Items、Source、FormulaText、FullyDecoded、Rgce、RgbExtra、BiffWritable、および BiffVersion
TXLSCompiledFormulaCreateTokenStream は、コンパイルされた数式トークン ストリームの呼び出し側所有の複製を返します
TXLSFormulaArrayFormulaMode、FormulaLocale、MaxRow、MaxCol、FuncNamebyPtg、FuncArgsCntByPtg、GetCompiled、GetCompiledPreservingUnknownNames、GetCompiledR1C1、GetTokenStream、GetTranslated、GetStoreData、GetStoreDataExt、CanStoreData、BindUserDefinedFunctions、GetTExpData、SetMode、IsKnownFunction、GetFunctionNames、および FunctionArgumentClass

どちらのワークブック エンジンも、1 つの共有 TXLSFormula インスタンスを通じて数式をコンパイルし、変換します。 GetCompiled は A1 形式のテキストを構文ツリーへ解析し、 GetCompiledR1C1 は数式が置かれたセルの座標を基準に R1C1 参照を解決し、 GetTranslated はクラシック BIFF バイトからツリーを再構築し、 GetStoreData 系はトークン バイトを保存用に書き戻します。 MaxRow と MaxCol は、コンパイラーが受け付ける参照グリッドの上限です。XLSX エンジンはこれを BIFF8 の既定値から XLSX のグリッドまで引き上げます。BIFF8 に収まらない参照には ptg 形式がないため、BIFF8 ライターはエンコード不能として報告します

ArrayFormulaMode は、ARRAY レコード(配列数式)の rgce を書き出している間だけ立てられるフラグです。このフラグが立つと、値クラスの参照と配列定数は、Excel 自身が書くのと同じように配列クラス(tAreaA / tArrayA)としてシリアライズされます。値クラスのオペランドのままでは、Excel はその配列数式を真の配列数式として扱わず、暗黙の交集で評価します。だからこそ、両エンジンは ARRAY レコード自身の rgce に対してこのフラグを立てます

単純な保存リーフの境界付き検査

TXLSCompiledFormula.ReadSimpleLeafInfo(ExpectedOwner, MaxBytes, MaxTextCharacters, AllowUnboundBiff) は、メインの構文ツリーと、保持されているトークン ストリームがあればそれをその場で検査します。クローン化、逆コンパイル、評価、トークンや配列の実体化は行いません。AllowUnboundBiff の既定は False です

サポートされる形は、1 つの絶対 REF3D または RANGE3D リーフと 1 つの文字列リテラルで、ストリームが保持されている場合はコヒーレントなトークンがちょうど 1 つ存在します。式、相対参照やオフセット参照、配列、外部配列データ、未知のトークン、メインと保持リーフの不一致、外部のバインド所有者は、キャッシュ値や計算状態を変更せずに fslkUnsupported を返します

TXLSFormulaSimpleLeafKindfslkUnsupported、fslkRange、または fslkLiteral です。他の結果フィールドを使う前に Kind を検査してください
TXLSFormulaLeafOwnerStateflosNoRetainedStream はトークン ストリームの出所なしを報告し、flosUnboundStream はインポートされた未バインド BIFF を報告し、flosSameOwner は正確なバインド所有者一致を報告し、flosForeignOwner は異なるバインド所有者を拒否します
TXLSFormulaSimpleLeafInfo文字列を含まない値レコードで、Kind、OwnerState、RangeType、ExternId、FirstRow、FirstCol、LastRow、LastCol、TextCharacters、StoredTextCharacters、ReadBytes、SyntaxNodes、TokenCount を持ちます
Range coordinates and identity座標は 0 から始まります。ExternId は BIFF のワイヤ インデックスではなく、論理的な 1 から始まる構文ツリー ID です。呼び出し側は固定されたワークブックを通じてこれを解決し、外部ブック、シートのまたぎ、欠落シート、またはサポートされるキャプチャ範囲外の座標を拒否しなければなりません
Source costsTextCharacters は UTF-16 コード単位でのリテラル出力長で、範囲の場合はゼロです。StoredTextCharacters は保持されたソース テキスト、トークン テキスト、検査された構文テキストの合計です。ReadBytes はそれらの 2 バイト テキスト コストと保持された生バイト長(個別に保持された表現を含む)の合計です。これらのカウンターは総ヒープ使用量ではなく、境界付き検査への入力を記述します
Syntax and token countsSyntaxNodes は、単純なコンパイル済みリーフでは 1、メインと保持リーフの両方をチェックした場合は 2 です。TokenCount はストリームなしではゼロ、サポートされるコヒーレントな保持ストリームがあれば 1 です
TXLSFormulaTokenStream.ReadSimpleLeafInfo下位層は同じ所有者とクォータ、オプションの ComparedLeaf、オプションの ReferenceContext を取ります。ストリーム自身のプライベートな構文、トークン、生バイトを直接チェックします。ComparedLeaf はメイン リーフのコヒーレンス チェックを追加し、ReferenceContext はシリアライズされたテキスト数式の extern インデックスをコピーせずにマップします
TXLSCompiledFormula.ReadSimpleLiteral同じ引数を取り、リーフ チェックを繰り返し、残りのバイト クォータと文字クォータが出力もカバーする場合にのみ、呼び出し側所有の WideString を返します。サポートされないリーフや残り容量の不足は EInvalidOperation を発生させます

ExpectedOwner は、消費するソースにアタッチされた calculator インスタンスそのものでなければならず、検査とリテラル抽出の間ずっと存続して安定している必要があります。所有者の欠落は EArgumentException を、負のクォータは EArgumentOutOfRangeException を、過大な保持ソース入力は EInvalidOperation を、内容比較や出力コピーの前に発生させます

保持ストリームを持たない単純なリーフは、元の所有者を確定しません。未バインドのインポート ストリームもワークブック ID を持ちません。したがって、明示的な AllowUnboundBiff=True が適切なのは、呼び出し側がすでにソースの calculator を固定していて、セルを読む前にローカル シート ID を検証する場合だけです。インポート参照の検査は現在、BIFF8 参照を受け付け、異なる BIFF5 extern 表現は拒否します

FFirstRowRel、FFirstColRel、FLastRowRel、FLastColRel という名前のレガシー構文フィールドは、絶対座標に対して true です。ヘルパーは独立したトークン相対フラグとオフセット表現もチェックするため、コンシューマーがこれらの歴史的な名前から絶対座標を推測する必要はありません

構文ツリー

CloneSyntaxTree は、構造的な検査のために TXLSSyntaxItem ノードの呼び出し側所有の解析済みツリーを返します。各ノードは、自身の ItemType、リテラル ペイロード(Value、IntValue、DecValue)、前方の Spaces、ツリー リンク(Parent、Child、ChildCount)、Range を通じた TXLSRangeItem としての参照リーフ、および配列定数データ(ArrayRows、ArrayCols、ArrayValueCount、ArrayValues 内の TXLSArraySerVal エントリ)を報告します。このツリーは独立したコピーであるため、走査してもワークブックのコンパイル済み数式には触れません。さらに、ミューテーション メンバー(AddChild、PushChild、CopyObject、OffsetCopyReferences、AdjustForShift、および TXLSRangeItem.CopyObject / AdjustForShift)は、再コンパイル前に複製したツリーを書き換えるツールのために用意されています

ワークブックのエントリ ポイント

Tokens := Worksheet.ParseFormulaTokens('SUM(A1:A4)', 1, 1);
try
  if Tokens.ReplaceReference(OldRef, NewRef) then
    Worksheet.SetFormulaTokens(1, 1, Tokens);
finally
  Tokens.Free;
end;

ParseFormulaTokens、GetFormulaTokens、FormulaTokensToText、および SetFormulaTokens は所有権を明示的に保ち、セルが変更される前にコンテキスト、BIFF バージョン、トークン サポート、配列の所有権、参照範囲を検証します

ユーザー関数レジストリ

TXLSUserFunctionResolver と TXLSUserFunctionRegistry は、RegisterHandler、UnregisterHandler、Clear、Contains、TryGetHandler、および Count を通じて名前による検索を提供します

Workbook.RegisterUserFunction('NETMARGIN', CalculateNetMargin);
Workbook.RegisterGlobalUserFunction('FISCALYEAR', CalculateFiscalYear);
try
  Workbook.Calculate;
finally
  Workbook.UnregisterUserFunction('NETMARGIN');
  Workbook.UnregisterGlobalUserFunction('FISCALYEAR');
end;

IXLSWorkbook、TXLSWorkbook、および TXLSXWorkbook は、RegisterUserFunction、UnregisterUserFunction、ClearUserFunctions、RegisteredUserFunctionCount、RegisterGlobalUserFunction、UnregisterGlobalUserFunction、ClearGlobalUserFunctions、および RegisteredGlobalUserFunctionCount を公開します

同等のユニット レベルのエントリ ポイントは、XLSRegisterGlobalUserFunction、XLSUnregisterGlobalUserFunction、XLSClearGlobalUserFunctions、XLSRegisteredGlobalUserFunctionCount、および XLSGlobalUserFunctionRegistered です

TXLSCalculator.OnUserFunctionResolve はレガシー イベントのフォールバックより先に参加し、レジストリ ハンドラーはレジストリ ロックの外部で呼び出されるため、ハンドラーは安全に自身を登録解除できます

危険な外部関数名およびマクロ スタイルの関数名は、ワークブックまたは個々のコンテキスト評価で AllowUnsafeFormulaCallbacks が明示的に有効化されていない限り、引数の評価とハンドラーの検索の前にブロックされます。通常のユーザー関数名は既定で引き続き利用できます

数式診断

TXLSXFormulaIssueKind、TXLSXFormulaLocation、および TXLSXFormulaIssue は、欠落している関数、外部参照、循環依存コンポーネントについて TXLSXWorkbook.AnalyzeFormulaIssues によって返されます

マクロ シートの検査

TXLSSheetKind は、TXLSWorksheet.SheetKind を通じてワークシート、マクロ シート、グラフ シート、VBA モジュール、不明なシート レコードを区別します。TXLSMacroRisk、TXLSMacroCommandInfo、および TXLSMacroCommandArray は、TXLSWorksheet.ScanMacroCommands の型付き結果を説明します

結合セルのオートフィットと並べ替えの型

TXLSMergedAutoFitStrategy と TXLSXMergedAutoFitStrategy は、結合スパンの拡張として最初、最後、またはバランスの取れた増分を選択し、TXLSSortOrientation、TXLSSortFormulaMode、および TXLSSortCompareEvent は、垂直または水平の安定した並べ替えと数式の移動を制御します

関連項目