XLSXの作成、編集、分析
| タスク | アプローチ |
|---|---|
| 作成 または 編集(数式・書式設定あり) | openpyxl — 後述の注意点を参照 |
| 大量データの入出力 | pandas(read_excel、to_excel) |
| シートのクイック確認 | markitdown file.xlsx — シートごとに ## SheetName を表示。.xlsm も読み取り可能。セル座標は表示されないため、編集の計画には使用しないこと |
| モデルの読み取り(数式 と 値の両方) | 2回の load_workbook パス — 後述の注意点を参照 |
openpyxl、pandas、markitdownはプリインストールされています —uv pip installを先に実行せず、スクリプトを書いて直接インポートしてください。インポートが失敗した場合(またはmarkitdownコマンドが見つからない場合)のみ、uv 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、ヘッダーに単位を記載(収益 ($mm)) · ゼロは - と表示(パーセンテージも含む、$#,##0;($#,##0);-) · 負の数は括弧内 · パーセンテージは 0.0%、分数として保存(0.15 は 15.0% と表示、15 を保存すると 1500.0% と表示) · バリュエーション倍率は 0.0x · 年はテキストとして("2024"、決して 2,024 ではない)。
構造: すべての前提条件をそれ自身のラベル付きセルに配置し、それを使用する数式から参照(=B5*(1+$B$6)、決して =B5*1.05 ではない) · すべての予測期間にわたって数式を一貫させる。なぜなら、行の途中の1つの編集されたセルが最も一般的なサイレントエラーだからです · ゼロになり得る分母をガードする。
依存関係
openpyxl、pandas、markitdown(pip、プリインストール — インポートが失敗した場合またはコマンドが見つからない場合のみインストール) · LibreOffice(soffice、サンドボックス環境向けに scripts/office/soffice.py で自動設定済み)
このスキルは Anthropic によって作成および管理されています。フロントマターメタデータを除き、そのままベンダー提供されています。利用条件については LICENSE.txt を参照してください。