計算と変換の忠実度
計算配列は、選択、並べ替え、検索、行列、再形成の各関数をまたいで組み合わせられます。XLSX のスピル所有は自動、CSE の宛先は明示的に指定でき、評価リソースには上限があります
動的配列と明示的な CSE 配列
配列を返す式を 1 つの TXLSXCell.Formula に代入し、TXLSXWorkbook.Recalculate を呼び出します。結果はそのセルにアンカーされた矩形のスピルを所有します。対象には SEQUENCE(3,2)、A1:A3*10、配列定数、配列を返す LET の結果といった数式が含まれます
Sheet.Cells.Item[1, 1].Formula := 'SEQUENCE(3,2)'; Sheet.Cells.Item[1, 4].Formula := 'SUM(A1#)'; Workbook.Recalculate;
再計算で結果は伸縮し、アンカーが所有する不要になったスピルセルだけがクリアされ、範囲が変わると依存関係が再構築されます。新しく作られたスピルセルへの参照や A1# スピル演算子は現在の範囲を使用します
既存の値、数式、リッチテキスト、他の配列、結合範囲、テーブル、ワークシート境界はスピルを妨げて #SPILL! を生み出します。それ以外で空のセルのスタイルはそのまま使え、妨げを取り除けば次の再計算でアンカーが再試行されます
スピルセルを値やリッチテキストで編集すると、そのセルはアンカーから切り離され、次の計算ではその編集が妨げとして保持されます。アンカーを削除またはクリアすると所有するスピルセルが解放され、ConvertFormulasToValues はそれらの計算値を通常のセルとして残します
XLSX 保存は現在の配列範囲とメタデータを記録し、読み込みは再計算の前に、キャッシュ済みスピルセルの所有関係を復元します。エラーを含む配列数式も、エラーが個々の要素に属する限り範囲を保持します
SetArrayFormula は、両方のワークブック エンジンで明示的な固定範囲 CSE のエントリ ポイントであり続けます。生の範囲演算はその範囲内で要素ごとに評価され、通常のスカラー数式は暗黙的なインターセクションを維持します
単項 @ 演算子は参照を数式セルと交差させ、計算配列の最初の要素を取り出します。SINGLE と ANCHORARRAY は、暗黙的なインターセクションとスピル参照の保存用エイリアスとして受け付けられます
MAP は複数の入力配列とそれに対応する LAMBDA パラメーター リストを受け付け、要素のエラーを伝搬させ、ネストした配列の結果を #CALC! で拒否します。FILTER は計算された配列と行または列のマスクを受け付け、エラーの伝搬に加え、フォールバックがない場合の空結果の #CALC! も同じく扱います
動的スピルの書き換えは、複数の計算スレッドを設定していても直列に実行されます。範囲の安定化は 32 パスまでに制限され、循環する反復計算内の動的配列はスカラー結果として扱われず拒否されます
INDEX は参照、配列定数、計算配列を受け付けます。両方のセレクターがスカラーのとき、正の行・列セレクターは 1 つの値を返し、ゼロのセレクターは選択された行または列を返し、両方がゼロなら完全な配列を返します。スカラー セレクターでの参照ソースは、ROW や ISREF といった利用側に対して参照の振る舞いを保ちます
行・列セレクターは配列にもなれます。定数、計算されたベクトル、範囲の値、LET のバインディングなどです。行と列の向きが対向するときは矩形のクロス積にブロードキャストされ、向きが一致するときはペアの位置を選択します。サイズ 1 の次元はブロードキャストされ、異なる次元で対応する位置がない場所は個別に #N/A を返します
どちらかのセレクターが配列のとき、ゼロや省略されたセレクターは行・列全体を展開するのではなく、その軸の最初の要素を選びます。小数のセレクターはゼロ方向へ切り捨てられ、負のセレクターは切り捨ての前に個別に #VALUE! を返し、ソースの境界を超えるセレクターは個別に #REF! を返します。選択された文字列、Boolean 値、型付きエラーは型を保持します
SORT と UNIQUE は、範囲、定数、計算配列を受け付けます。ネストした FILTER、SEQUENCE、LET の結果も含まれます。行・列の向き、昇順・降順、最初の出現順、1 回だけの重複除去は、ソースの形式が違っても同じ契約に従います
ワークブック レベルの定義名は、参照、スカラー、計算配列のソースを供給できます。ISREF(INDEX(...)) は実際の参照結果と、名前に束縛された計算値を区別します。スカラーの INDEX セレクターと SORT の数値オプションは小数を切り捨て、省略可能な Boolean 引数は TRUE と FALSE 以外のテキストを拒否します
Sheet.Cells.Item[1, 6].Formula := 'SORT(UNIQUE(FILTER(A1:B5,A1:A5>1)),1,-1)'; Sheet.Cells.Item[1, 9].Formula := 'INDEX(SORT(UNIQUE(A1:B5)),0,2)'; Sheet.Cells.Item[1, 12].Formula := 'INDEX(SEQUENCE(2,3,10,2),2,3)'; Workbook.Recalculate;
Sheet.Cells.Item[1, 1].Formula := 'INDEX(SEQUENCE(3,3),{1;3},{1,3})';
Workbook.Recalculate;
このセレクターの例は {1,3;7,9} を 2x2 の結果としてスピルします。一方、INDEX(SEQUENCE(3,3),{1;3},{1;3}) はペアになった列 {1;9} を返します。ソースが参照でも配列セレクターは値を生み出し、スカラーの参照セレクターは参照としての同一性を保ちます
これらの式は XLSX でスピルして伸縮するか、明示的な CSE 宛先の中で評価されます。配列ソースのエラーは型付きのままで、1 回だけの重複除去が空になった場合は #CALC! を返します。セレクターの出力は評価ステップの予算を消費し、ソース、セレクター、結果の行列ペイロードの合計は配列メモリ予算に対してチェックされます
INDEX は計算ソースに対して明示的な第 4 引数 area_num として 1 を受け付け、行・列・領域の各セレクターは、サポートされる同一シートの参照ユニオンに対して一緒にブロードキャストできます。実際の複数領域参照はローカルの定義名と LET を通じて同一性を保ち、スカラーの CHOOSE は選択された参照を保持します。別シートへの選択も含みます。セレクター配列の結果はネストした参照配列ではなく値です。ゼロ、欠落、型変換、エラーの規則については INDEX の領域選択と参照同一性 を参照してください
スタンドアロンの計算では、TXLSCalculator.OnGetSpillRange がアンカーの現在の両端を含む範囲を解決する TXLSGetSpillRange コールバックを受け付けます。ワークブックに裏付けられたエバリュエーターはこのコールバックを自動的に設定します
TXLSGetSpillRange = function(SheetIndex, AnchorRow, AnchorCol: Integer; var LastRow, LastCol: Integer): Integer of object;
lxNormalizeStorageFormula は OOXML 向けに作成時の数式構文を正規化し、lxTryStorageFormulaOperators はスピルと暗黙的なインターセクションの演算子を変換し、lxApplyXlfnPrefix は必要な将来関数のプレフィックスを適用します。保護されたテキストと配列行の区切りはそのまま残り、数式の代入では呼び出し側のテキストがメモリ上に保持されます
保存はメモリ上の作成時の式を変更しません。新しく作成した XLSX 数式を再オープンすると、引数がカンマで先頭に = のない正規の保存構文が返り、ネイティブ Excel のインポートと一致します。変更されていないインポート済み数式 XML は既存の保持パスをそのまま使います
検索、行列、再形成の組み合わせ
TRANSPOSE は参照、定数、計算配列を受け付け、テキスト、Boolean 値、個々のエラーを保持します。空のソース セルは数値 0 になります
MMULT、MDETERM、MINVERSE は計算された行列や、MMULT(MUNIT(2),SEQUENCE(2,2)) のようなネストした式を受け付けます。行列の要素は数値でなければならず、テキスト、Boolean 値、空白は強制変換されず拒否されます。ソースのエラーはエラーコードを保持します
CHOOSECOLS と CHOOSEROWS はスカラーまたは 1 次元のセレクター ベクトルを受け付け、引数順にセレクターを連結し、重複を保持し、負のインデックスは末尾から数えます。小数のセレクターはゼロ方向へ切り捨てられ、ゼロや範囲外のセレクターは拒否されます。2 次元のセレクター行列は未対応です
XLOOKUP、XMATCH、MATCH は計算された検索ベクトルと配列形式の検索リクエストを受け付けます。キーは 1 行または 1 列に収まる必要があり、XLOOKUP の戻り配列はその検索軸に揃える必要があります
スカラーの XLOOKUP は、型付きエラーを含めて一致した行や列全体を返せます。配列形式の検索リクエストは自身の形状を保ち、一致した各スライスやフォールバック配列の最初の要素を取ります
完全一致の検索スキャンはキー ベクトル内のエラー要素をスキップします。Boolean、数値、テキストのキーは区別されたままで、通常のスカラー参照パスは既存のストリーミングと再計算キャッシュの動作を保ちます。バイナリ サーチのモードでは、正しく並べ替えられたキーが依然として必要です
VSTACK、HSTACK、TAKE、DROP、TOROW、TOCOL、WRAPROWS、WRAPCOLS、EXPAND は計算された入力と型付きのパディングを受け付けます。行や列を持たない結果は #CALC! を返し、折り返しには 1 次元の入力が必要です
行列の処理、検索スキャン、セレクターの走査、コピー、パディングは評価ステップの予算を消費します。同時に保持される入力、作業用、出力の行列ペイロードは、割り当て前に設定された配列メモリ上限に対してチェックされます
Sheet.Cells.Item[1, 1].Formula := 'XLOOKUP({1;3},SEQUENCE(3),SEQUENCE(3,2))';
Sheet.Cells.Item[1, 4].Formula := 'CHOOSECOLS(SEQUENCE(2,3),{-1;1})';
Sheet.Cells.Item[1, 7].Formula := 'TRANSPOSE(UNIQUE({"A";"B";"A"}))';
Workbook.Recalculate;
型付きのモダンな計算エラー
#SPILL! と #CALC! は、計算、表示、キャッシュの検査、XLSX の再オープンを通じて型付きのセル エラーであり続けます。XLSX 出力はリッチ値のメタデータを運びつつ、その拡張を理解しないリーダー向けに標準のキャッシュ エラー フォールバックも保持します
CSE と動的配列のスピルセルを含む数式テキストの結果は、再計算前に Excel が表示できるようリテラル文字列キャッシュを使用します。単純な値セルは引き続き共有文字列を使います
モダンなリッチ エラー出力には、再計算前に Excel がそれらのキャッシュを解釈するために必要なワークブック バージョンと Rich Data 計算機能の宣言が含まれます。出力される calcId は 191029 以上で、より高い要求値を保持しつつ、ワークブックのメモリ上の CalcId プロパティは変更しません
新しいエラー バケットを追加しても、インポート済みのセルや値のメタデータ、無関係なリッチ値構造、不透明なバケットは元の同一性を保ちます。エラー セルを置き換えると、保存時に古い型付きエラーのメタデータがクリアされます
TXLSXRichErrorCodes は、デコード済みリッチ エラー バケット用の整数配列型です。アプリケーション コードはセルの Variant 値から型付きエラーを読み取ります
BIFF8 はこれらのモダンなエラーやスピル演算子を忠実に表現できません。Classic シリアライザーは無関係な旧式エラーコードを割り当てる代わりに、未対応のモダン表現を拒否します
変換プリフライト
TXLSXWorkbook.GetConversionReport は、再計算やワークブックの変更を行わずに、呼び出し側所有の TXLSConversionReport を返します。型は lxDiagnostics で宣言されています
Report := Workbook.GetConversionReport(xlsConversionOpenDocument);
try
for I := 0 to Report.Count - 1 do
InspectIssue(Report.Items[I]);
finally
Report.Free;
end;
| Target | xlsConversionOpenXmlWorkbook、xlsConversionOpenXmlTemplate、xlsConversionMacroEnabledTemplate、xlsConversionOpenDocument、xlsConversionExcel97Workbook、xlsConversionExcelBinaryWorkbook のいずれか |
| Fidelity | TXLSConversionFidelity: xlsConversionPreserved、xlsConversionDegraded、xlsConversionDropped、xlsConversionUnsupported のいずれか |
| Issue | TXLSConversionIssue は Feature、Fidelity、SheetIndex、SheetName、Location、Message を公開し、HasLoss は低下、欠落、未対応のエントリを含みます |
レポートは、VBA、保護、ワークブック ビュー、接続、クエリ テーブル、コメント、外部リンク、XML マップ、テーブル構造、フィルター条件、図形、型付きエラーのキャッシュ、未対応の入力規則や数式構文、配列の所有、不透明な拡張パーツといった既知のフォーマット損失を一覧化します。実装済みの変換パスを説明するものであり、外部アプリケーションごとの全機能を保証するものではありません
ODS は通常の表セル、キャッシュ済みの数式結果、対応する注釈テキストと作成者、パスワードなしのワークシート保護、表現可能なフィルターを保持する一方、Excel のテーブル オブジェクト、より高機能なグラフ ジオメトリ、未対応のルール セマンティクスは失われます。ターゲットが運べない不透明な OOXML 保持ペイロードは欠落として報告されます
XLSX ファサードは BIFF8 出力を未対応として報告します。BIFF を使うワークフローでは Classic ワークブック API を使用してください。バージョン 2.384.93 では、チェック付き・チェックなしのどちらの保存でも、表現できない数式、機能オブジェクト、メタデータ、計算設定を拒否する 上限付きの XLSB 値とスタイル バックエンド が追加されています
チェック付き保存
Status := Workbook.SaveAsChecked(Stream, xlsxOpenDocumentSpreadsheet, False);
ファイルとストリームの各オーバーロードは、書き込み前に既知の損失のプリフライトを実行します。AllowLossy=False は低下や欠落の機能を変換診断付きで拒否し、AllowLossy=True はそれらの損失を明示的に受け入れつつ、未対応の変換はそれでも拒否します
プリフライトが拒否されても、宛先のバイト列とストリーム位置は変わりません。成功したリクエストは既存の保存トランザクションを使い、SaveAs と同じ保存ステータスの規約で値を返します
通常の SaveAs も既存の動作のまま利用できます。損失を明示的に決定する必要があるアプリケーションは、レポートを確認した上でチェック付き保存を使ってください
テンプレート形式
xlsxOpenXMLTemplate はマクロなしの XLTX を選択し、xlsxOpenXMLMacroEnabledTemplate は XLTM を選択して既存の VBA プロジェクトを保持します。形式は明示的に指定するもので、拡張子やインポートしたテンプレートから推測されません
マクロなしの XLTX は、損失を許すチェック付き保存が有効でも VBA を含むワークブックを拒否します。XLTM パッケージは VBA プロジェクトなしで出力されることもあり、HotXLS が VBA コードを作成することはありません
ODS の入力規則の数式
カスタムの Boolean 入力規則は of:is-true-formula(...) を使用します。対応するスカラー境界、リスト ソース、修飾済み A1 参照、文字列、引数区切りは OpenFormula に変換され、インポート時に入力規則の基準セル アドレスを基準に再度解決されます
未対応の構造化、外部、3 次元の入力規則式は、セル参照とともに省略され、宙に浮いた入力規則の定義を残しません。省略されたルールは変換プリフライトが報告します
ODS の注釈、保護、フィルター
通常のセル コメントは、テキストと作成者ごと OpenDocument 注釈としてエクスポートされます。空のメモ、タブ、空白、改行も含まれます。セルが存在しない場所や遠方の座標へのメモは、ワークシート セルを作らず、疎な繰り返し行・列指定で表現します
結合範囲のアンカー セルにあるコメントはアドレスを保持します。覆われたセルやワークシート グリッド外のメモは欠落として報告されます。リッチなコメント テキストは表示テキストへ平坦化され、変換レポートは run スタイル、カスタム ボックス寸法、常に可視のプレゼンテーションの損失を特定します
OpenDocument の保護フラグと、対応するロック/ロック解除セルのスタイルは保持されます。ロスなしのワークシート保護サブセットはパスワードや編集可能範囲の例外を使わず、ロック・ロック解除両セルの選択だけを許します
Sheet.Protect; Sheet.SheetProtectionOptions := [xlsxSpoSelectLockedCells, xlsxSpoSelectUnlockedCells]; Sheet.Range['B2:B100'].Locked := False;
Excel のパスワード ハッシュ、モダンなパスワード設定、編集可能範囲、そのサブセット外の操作権限は、保護フラグが残るまま低下として報告されます。Excel の広範なデフォルト権限セットも明示的な損失の決定を要求します
OpenDocument インポートは保護フラグとセル ロックのスタイルを保持します。ネイティブのパスワード ハッシュを Excel のハッシュへ変換することはなく、表現できないインポート済み権限メタデータは、その後の変換レポートでも名前付きの損失として残ります
オートフィルターのエクスポートは 6 種類のスカラー比較演算子、AND か OR で結合した列あたり最大 2 つのスカラー条件、列間の AND をサポートします。対応する単純な値選択リストと空白選択に 2 値の上限はなく、ネイティブのフィルター メタデータのまま残ります
数値のスカラー条件は不変の有限値を使います。テキスト選択はリテラル文字を保持し、選択リスト内のワイルドカード文字も含まれます。一方、カスタム フィルターのワイルドカード式、曖昧な Boolean 条件、日付グループ、動的な日付、色とアイコンのフィルターには、対応する変換がありません
未対応のフィルター式は、選択された条件を弱める形ではなく、式ごと省略されます。フィルター範囲は残り、省略された条件は変換レポートが特定します
ODS のストリーム保存は、宛先の元の位置へ書き込む前に、完成したパッケージを登録済みの一時ファイルへステージングします。既存の先頭バイト列と絶対 ZIP オフセットは、元の終端を超える位置も含めて保持されます。コミット前のキャンセルや進行状況コールバックの例外では、宛先のバイト列、サイズ、位置が保たれ、一時ファイルは解放されます。最終書き込みの通知はキャンセル不可のままです
OpenDocument インポートは、同じスカラー条件の AND と同一列内のテキスト OR・値セットをサポートします。列をまたぐ OR、正規表現、大文字小文字を区別する比較、未対応のネイティブ フィルター演算子は、明示的なインポート損失のままです
TXLSXOdsImportLoss と TXLSXOdsImportLosses はワークシート内部の由来カテゴリを記述します。変換レポートは ImportedOdsProtectionPassword、ImportedOdsProtectionOptions、ImportedOdsFilterCriteria、ImportedOdsCommentFormatting を使用します。これらはワークシートのコピーでも残り、OpenDocument と Open XML の両方の変換ターゲットで現れます
フィルター変換は、フィルターを適用したりセルを再計算したりせずに、メタデータと既存の行の可視性を保持します。独自のフィルタリングや編集の動作についての責任はネイティブ アプリケーション側に残ります