AI・事務効率化

Excelをプログラムで書き換えたら、画像と数式が消えていた話

Pythonの openpyxl でExcelファイルを保存したところ、埋め込み画像・数式の計算結果・印刷設定がまとめて消えていました。気づいたきっかけと、原本を壊さずに書き換える方法をまとめます。

取引先から届いた指定書式のExcelに、数千行の実績を書き込む作業があります。手作業では1日仕事なので、Pythonの openpyxl というライブラリで自動化していました。

ある日、出来上がったファイルのサイズを見て違和感がありました。1.1MBあった原本が、書き込み後は280KBになっていたのです。

何が消えていたか

開いて確認したところ、消えていたのはこれだけありました。

  • 埋め込み画像 — 各シートに貼ってあった写真が全部なくなっていた
  • 数式の計算結果 — 数式は残っているが、結果の値が空になっていた
  • 印刷設定 — 用紙サイズ・余白・印刷範囲の指定
  • 図形やコメント — 注釈として置かれていた吹き出し

いちばん怖いのは、数式の計算結果です。数式そのものは残っているので、Excelで開けば再計算されて正しく表示されます。つまり自分の環境で開くと正常に見える。ところが、Excelを使わずにプレビューする環境や、PDF変換して確認する相手には、空欄や0として見えてしまいます。

過去に一度、取引先から「数字が入っていない」と指摘を受けたことがありました。あのときの原因がこれでした。

なぜ消えるのか

openpyxl は、Excelファイルを読んで、自分が理解できる範囲のものだけを再構成して保存します。理解できない要素は単純に引き継がれません。

xlsxファイルは、実体としては複数のファイルを1つに固めたものです。シートの中身、スタイル、画像、印刷設定などが別々に入っています。openpyxl が扱うのは主にセルの値とスタイルなので、それ以外は保存の時点で落ちます。

「読み込んで、何も変えずに保存する」だけでも消えます。これが厄介なところです。

どう直したか

最初にやった対症療法

まず、消えた数式の計算結果だけを書き戻す処理を書きました。原本から計算結果を読み出しておいて、保存後のファイルの中身を直接開いて値を差し込む、というやり方です。

これで数字は復活しました。ただ、画像は戻りません。

結局こうした:原本を土台にして、必要な部分だけ差し替える

考え方を変えました。新しく作り直すのではなく、原本をそのまま引き継いで、書き換えたい部分だけ差し替える方式です。

  1. 原本のファイルをそのまま複製する
  2. 中に入っているシートの中身だけを取り出す
  3. 必要なセルを書き換える
  4. 書き換えたシートだけを元の場所に戻す

こうすると、画像も印刷設定も図形も一切触らないので、そのまま残ります。実際に、書き換え前後で画像のデータが一致していることを確認できました。

手間はかかりますが、既存のファイルに書き込む案件では、いまはこの方式を標準にしています。

ほかにも踏んだ罠

行を挿入すると結合セルがついてこない

openpyxl で行を挿入すると、結合されたセルの範囲が元の位置に取り残されます。挿入した行の下にある結合セルが、1行ずれた場所を指したままになるのです。

行を挿入する前に結合を解除して、挿入後に新しい位置で結合し直す必要があります。

日付の書式が勝手に変わる

8月13日 と表示する書式を設定して保存し、そのファイルをもう一度開いて保存すると、内部的な書式の書き方が正規化されます。Excelでの見た目は変わりませんが、機械的に「前回と同じ書式か」を比較すると全部不一致になります。

検証スクリプトが誤検知を出して、実際には問題ないのに大騒ぎしました。

ファイル名に「表」が使えない

これは完全に想定外でした。「CP番号一覧表.xlsx」というファイルがPythonから開けません。

原因は文字コードでした。Shift-JISで「表」という文字を表すと、2バイト目が \ と同じ値になります。これがパスの区切り記号として解釈されてしまうのです。「ソ」「十」「欧」なども同じ問題を起こします。

ファイル名を「CP番号リスト」に変えて解決しました。日本語のファイル名を機械的に扱うときは、この種の文字を避けるのが無難です。

いちばんの教訓

書き換えたら、原本と中身を突き合わせて「何が消えたか」を必ず確認すること。

セルの値だけを見ていると、画像や印刷設定が消えていることに気づけません。今回もファイルサイズの急減がなければ、そのまま取引先に送っていました。

ファイルサイズが大きく減っていたら、それは危険信号です。


Excelの自動化や帳票の自動作成については、AI導入支援・業務効率化のページもご覧ください。既存の書式を壊さずに自動化する方法をご提案できます。

同じことを、御社でもやれます

この記事に書いた内容は、私たちが実際に自社の業務でやったことです。似た作業でお困りでしたら、そのままご相談ください。