XLSX 作成、編集、分析
| タスク | アプローチ |
|---|---|
| 作成または編集(数式・書式あり) | openpyxl — 後述の注意点を参照 |
| 一括データ入出力 | pandas(read_excel、to_excel) |
| シートの簡易確認 | markitdown file.xlsx — シートごとに ## シート名 を表示。.xlsm も読み取り可。セル座標は出力されないため、編集計画には使用しないこと |
| モデル(数式と値の両方)の読み取り | 2回の load_workbook パス — 注意点を参照 |
openpyxl、pandas、markitdownはプリインストールされています。最初にpip installを実行せず、スクリプトを書いて直接インポートしてください。インポートが失敗した場合(またはmarkitdownコマンドがない場合)のみ、pip installで不足しているパッケージをインストールしてください。
以下のスクリプトパスは、このスキルのディレクトリからの相対パスです。
すべての出力に対する要件
- プロフェッショナルフォント(Arial、Times New Roman)を全体で使用すること。ユーザーが別途指定した場合を除く。
- 数式エラーゼロ。
recalc.pyがerrors_foundを報告する限り、決して納品しないでください。エラーがあなたの作業以前から存在すると考える場合、その証拠を示してください:data_only=Trueで元のファイルを読み込み、該当セルを確認してください。あなたが導入したエラーは、引き継いだエラーとまったく同じように見えます。 - 数式を使用し、ハードコードされた結果を使用しないこと。
sheet['B10'] = '=SUM(B2:B9)'と記述し、Pythonで計算した合計値は書き込まないでください。シートは入力が変更されたときに再計算される必要があります。 - ユーザーの仕様を文字通りに従うこと。 正確なタブ名、正確な列ヘッダー、ユーザーが指定した通りの数式。別の値を計算するリデザインは、どんなに洗練されていても失敗です。
- すべての仮定とハードコードされた数値を、読者が確認できる場所に文書化すること — セルコメント、またはテーブルの末尾の隣接セル。実在する情報源がある場合は引用すること(
出典:企業 10-K、2024年度、45ページ、収益注記、[SEC EDGAR URL]);数値がユーザーから提供された場合は、その旨を明確に記載すること。 - ユーザーが記入するために作成するワークブックには、どのセルを編集すべきかを示す短い凡例と、期待される形式を示す1行の現実的な値のサンプル行を含めること。編集を依頼されたファイルにそのような行を追加しないでください。
- 既存ファイルの編集:そのファイルの規則に完全に従うこと。 それらはここでのすべてのガイドラインに優先します。まず指定された入力セルを見つけてください — 異なるフォントカラー、塗りつぶし、または網掛けでマークされています — そこにのみ書き込み、既存の数式には一切触れないでください。
再計算(ファイルに数式が含まれる場合は必須)
openpyxl は数式を文字列として書き込みますが、キャッシュされた値はありません。再計算するまで、すべての数式セルはキャッシュ値を読み取るもの(pandas、load_workbook(data_only=True)、ほとんどのプレビューア)に対して None と読み戻されます。
python scripts/recalc.py output.xlsx [タイムアウト秒数] # デフォルト 30
LibreOffice がすべての数式を計算し、ファイルはその場で上書きされ、JSON が出力されます:status(success | errors_found)、total_formulas、total_errors、およびエラーの種類ごとに最大100セルを名前付ける error_summary(locations_truncated は保留された数を示します — リストの長さではなく total_errors を信頼してください)。指定された内容を修正し、再度実行してください。status ではなく error キーを持つ JSON は、何も再計算されなかったことを意味し、その場合のみ非ゼロで終了します — errors_found は0で終了するため、クリーンな終了をクリーンなワークブックと見なさないでください。
緑色の再計算は、数式が評価されることを証明するだけであり、正しいことを証明するものではありません。 範囲の1オフセットエラーや間違った行への参照は、間違った数値を持つ、クリーンでエラーのないファイルを生成します。最初に2〜3個の数式を書き、期待する値を取得していることを確認してから、グリッドを構築してください。
別のファイルにリンクするワークブックは、openpyxl で再保存してから再計算すると、それらのリンクを失います。そのような数式は ='[1]Returns Analysis'!$B$2 と読み取られます — [1] はワークブックの外部参照リストへのインデックスであり、シートではなくディスク上の別ファイルを指定します。そのファイルはここにはほとんど存在しないため、セルのキャッシュ値だけがデータを保持しています。openpyxl は保存時にその値を削除します。その後、LibreOffice は参照を実際に解決する必要があり、失敗し、#NAME? を書き込み、すべてのリンクを削除します。recalc.py はその状態での実行を拒否します — 上書きする前に元のファイルからそれらのセルの値をコピーしてください(--force で上書きし、損失を受け入れます)。
検証を通過する数式の選択
LibreOffice は Excel よりも少ない関数しか実装しておらず、評価できない関数は文字通りの #NAME? として納品するファイルに焼き付けられます。
- Excel-2007時代の関数を推奨 —
SUMIFS、INDEX、MATCH、IFERROR、SUMPRODUCT— これらはプレフィックスを必要としません。 - 2007年以降の6つの関数は、
_xlfn.プレフィックスを付けると動作します。なぜなら、openpyxl は数式をXMLにそのまま書き込み、Excel は2007年以降の名前をプレフィックス付きで保存するからです(UIではプレフィックスは隠れます):_xlfn.TEXTJOIN、_xlfn.CONCAT、_xlfn.IFS、_xlfn.SWITCH、_xlfn.MAXIFS、_xlfn.MINIFS。プレフィックスなしで書くと、それぞれ#NAME?になります。 XLOOKUP、XMATCH、SORT、FILTER、UNIQUE、SEQUENCEは絶対に使用しないでください。 ランタイムの LibreOffice は、どのプレフィックスでもそれらを評価できません。新しいビルドでは評価できますが、これらはスピル配列関数であり、openpyxl で書き込まれたファイルにはスピルメタデータがないため、範囲の左上のセルだけに値が入ります — そしてrecalc.pyは切り詰められた結果に対してtotal_errors: 0を報告します。ルックアップにはINDEX/MATCHを使用し、並べ替え、フィルター、重複除去はセルに書き込む前にPythonで行ってください。- LibreOffice が解析できなかった数式は小文字で書き戻されます —
#NAME?の横にある素早い手がかりです。
openpyxl の注意点
- モデルの読み取りには2回のロードが必要です。
data_only=Trueはキャッシュされた値を生成しますが、数式は失われます。デフォルトでは数式文字列が得られますが、値はありません。1回のパスで両方を取得することはできません。 data_only=Trueで保存すると破壊的です。 そのワークブックには数式が残っていないため、保存するとすべてのセルがリテラル値に置き換えられます — 永続的に。- openpyxl が書き込んだばかりのファイルに対して
data_only=Trueを使用すると、すべてのセルでNoneが返ります — 最初にrecalc.pyを実行してください。(結果が""の数式もNoneと読み戻されます。) - 結合セル:左上のアンカーセルにのみ書き込んでください。 範囲内の他のすべてのセルは
MergedCellであり、.valueは読み取り専用です。 .xlsmファイルはマクロを失います。load_workbookにkeep_vba=Trueを渡さない限り。- シート名にスペースが含まれる場合は、シート間参照で引用符で囲む必要があります:
='Assumptions Inputs'!$B$5。引用符なしでは、#VALUE!と評価されます。
金融モデル
ユーザーが別途指定した場合、または既存ファイルが既に別の方法を使用している場合を除きます。
色: ハードコードされた入力値とシナリオレバーには青色テキスト(0,0,255)· 数式には黒色 · 別シートへのリンクには緑色(0,128,0)· 別ファイルへのリンクには赤色(255,0,0)· 主要な仮定とユーザーが記入すべきセルには黄色の塗りつぶし(255,255,0)。
数値: 通貨 $#,##0、ヘッダーに単位を明記(収益(百万ドル))· ゼロは - で表示(パーセンテージも含む、$#,##0;($#,##0);-)· 負数は括弧内 · パーセンテージ 0.0%、小数として保存(0.15 は 15.0% と表示;15 を保存すると 1500.0% と表示)· バリュエーション倍率 0.0x · 年はテキストとして("2024"、決して 2,024 ではない)。
構造: すべての仮定は独自のラベル付きセルに配置され、それを使用する数式から参照される(=B5*(1+$B$6)、決して =B5*1.05 ではない)· すべての予測期間にわたって数式を一貫させる(行中盤で単独編集されたセルが最も一般的な無言のエラーであるため)· ゼロになる可能性のある分母をガードする。
依存関係
openpyxl、pandas、markitdown(pip、プリインストール — インポートが失敗した場合またはコマンドがない場合のみインストール)· LibreOffice(soffice、サンドボックス環境向けに scripts/office/soffice.py によって自動設定済み)