Excelで00123と見えるセルが、Pythonでは123として読み込まれることがあります。セルの値が数値123で、表示形式だけを五桁のゼロ埋めにしている場合です。文字列00123を保存したセルとは、見た目が似ていても中身が違います。
openpyxlではセルのvalueで値、number_formatで表示形式を読めます。商品コードを取り込む前に、値と見せ方のどちらにゼロがあるかを確認します。
数値と文字列を別のセルへ保存
次の例は既存の帳票を開かず、架空のブックをメモリー上に作ります。A1は数値123と表示形式00000、B1は文字列00123です。保存後に読み直し、値と型を表示します。
from io import BytesIO
from openpyxl import Workbook, load_workbook
book = Workbook()
sheet = book.active
sheet["A1"] = 123
sheet["A1"].number_format = "00000"
sheet["B1"] = "00123"
buffer = BytesIO()
book.save(buffer)
book.close()
check = load_workbook(BytesIO(buffer.getvalue()))
sheet = check.active
print("A1の値:", repr(sheet["A1"].value), type(sheet["A1"].value).__name__)
print("A1の表示形式:", sheet["A1"].number_format)
print("B1の値:", repr(sheet["B1"].value), type(sheet["B1"].value).__name__)
assert sheet["A1"].value == 123
assert sheet["B1"].value == "00123"
check.close()
A1はint型の123で表示形式が00000、B1はstr型の00123です。Windows・Python 3.12.10・openpyxl 3.1.5で、保存後の値と型を確認しました。Excelの画面上の表示を確認した結果ではありません。
number_formatを文字列へ付けても、それだけで値が数値へ変わるわけではありません。書式の指定と値の変換を、同じ処理として扱わないことがポイントです。
五桁へ補う規則を勝手に決めない
123を00123へ直すには、常に五桁であるという仕様が必要です。表示がゼロ埋めになっていることは手がかりになりますが、入力元が正しいコード体系を保っているかまで保証しません。
zfill(5)などで桁を補う処理を入れる場合は、桁数、英字を含むコード、空欄、五桁を超える値の扱いも決めます。数値123と文字列123を同じコードとみなしてよいかも確認してください。
一般の表示形式には、日付、通貨、条件付きの表示などがあります。number_formatを見て、どの形式でも画面どおりの文字列へ自動変換できると考えないようにします。この例は単純なゼロ埋めだけを扱います。
取り込み先にも型を引き継ぐ
Excel側で文字列として読めても、CSVへ保存して別の道具で開く段階で、再び数値として解釈される場合があります。コードを保持する確認は読み込みだけで終えず、保存して次に読むところまで行います。
比較用のコードを作るなら、元のセル座標、元の値、元の型、採用した変換規則を残すと、照合できない理由を追いやすくなります。元帳票へ一律の書式変更を加えて合わせる必要はありません。
最初は数値のセル、文字列のセル、空欄を含む小さなコピーで試してください。見た目がそろっている表ほど、値と書式の違いを先に確認すると後の取り違えを減らせます。
セル操作の基本はopenpyxl入門、文字列の桁や空白を扱う操作はPythonの文字列操作で確認できます。
参考資料
openpyxlのスタイル公式資料を2026年11月1日に確認しました。
