ValueError: Row or column values must be at least 1

Excel
本ページはプロモーションが含まれています

はじめに

pythonで演算した結果を格納したリストの値をエクセルに出力しようとした時にエラーが発生しました(具体的にはenumerateでループ操作をしながらopenpyxlでエクセルに値を書き込んだ時)

今回はその時のエラーについてのメモです。

エラー&原因

エラーメッセージ

発生したエラーは

ValueError: Row or column values must be at least 1

というものでした。

「値のエラー:行または列の値は少なくとも1以上である必要があります」

と言っています。

サンプルプログラム(失敗例)

エラーが発生する例を見てみます。
次のソースコードを実行するとエラーメッセージ「ValueError: Row or column values must be at least 1」が表示されます。

import openpyxl

# 新しい Workbook を作成
wb = openpyxl.Workbook()
sheet = wb.active

# 2次元配列
sample_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for y, row in enumerate(sample_lists):
  for x, cell in enumerate(row):
    sheet.cell(column=x, row=y).value = sample_lists[y][x] # ここでエラーが発生

wb.save("sample.xlsx")

原因

openpyxlでは、行と列のインデックスは1から始まりますが、Pythonのリストのインデクスは0からですね。
そのため、リストの0から始まるインデックスをopenpyxlでそのまま使いエラーが発生したという訳でした。

サンプルプログラム(成功例)

次のサンプルプログラムは上手く実行される例です。

import openpyxl

# 新しい Workbook を作成
wb = openpyxl.Workbook()
sheet = wb.active

# 2次元配列
sample_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for y, row in enumerate(sample_lists):
  for x, cell in enumerate(row):
    sheet.cell(column=x+1, row=y+1).value = sample_lists[y][x] # インデックスに1を加えて修正

wb.save("sample.xlsx")

インデックスを揃えることでエラーが表示されなくなりました。

さいごに

今回はPythonでエクセルファイルに結果を出力するプログラムで発生したエラーについてでした。

pythonはExcelに書き込みを行うライブラリが用意されていて非常に便利ですよね。
一方でセルへの書き込みや書式の変更などなれないとコーディングは少し大変かと思います。

業務場所にもよりますが、まだまだエクセルを使っているところは多いですよね。
こうしたエクセルへの操作を覚えると業務効率が上がるのではないでしょうか?

とかいう僕も業務効率へ一役買う事が出来たことがありましたが、それがpythonとエクセルでした。

↓の本が非常に役に立ちました。
個人的には自分の転機になった本の一つだったりします。
(オライリーにしたら珍しく読みやすいですw)

 

この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。

タイトルとURLをコピーしました