※社外のコラムニストによる記事です。Python関連の情報をお伝えします。
「シゴトがはかどるPython自動処理の教科書」(著:クジラ飛行机様/マイナビ出版)を利用して、Pythonを使った自動化について学んでいきます。
前回はExcelの操作をするパッケージ「openpyxl」を利用して、基本的な動作(ファイルの作成と読込)を確認しました。今回は、openpyxlを利用してExcelシートに書き込む方法について学びます。
openpyxlで、Excelに書き込む方法の基本
まず、セルに値を設定する際、どのセルに値を設定したいかを指定する方法として以下の3つがあるそうです。
- セル名を指定する
- 行番号と列番号を指定する
- 先にセルを取得した後に、セルに値を設定する
②の行列番号の指定方法はrow(行)、column(列)という引数を利用します。
ちなみに、Pythonのリストの場合、インデックス番号は0から数えられますが、Excelの場合は1から数える形で良いそうです。なので、例えばセルB3を指定したいなら、(row=3, column=2)というように記述することになります。

では具体的にどう書いていけばいいのか、用意されていたサンプルコードを引用の上、実行して確認してみます。
————————
P.48
# openpyxlを取り込む import openpyxl as excel # ワークブックを生成しワークシートを得る book = excel.Workbook() sheet = book.active # A1に値を書き込む — (*1) sheet[“A1”] = “勤勉な人の計画は必ず成功する” # A2(row=2, column=1)に値を書き込む — (*2) sheet.cell(row=2, column=1, value=”猿の尻笑い”) # A3(row=3, column=1)に値を書き込む — (*3) cell = sheet.cell(row=3, column=1) cell.value = “捜すのに時があり諦めるのに時がある” # 保存 book.save(“cell_w.xlsx”) |
————————
これの実行結果がこちらです。

.pyファイルがあるのと同じフォルダ内にcell_w.xlsxというファイルが作られ、中にはA1、A2、A3のそれぞれのセルに値が設定されています。
連続データをExcelに書き込んでみる
という基本を押さえたうえで、次にfor文を使って連続で値を入れていく方法を学びます。
こちらは0~9までの連続する値をセルに入れるというサンプルコードです。
————————
P.49
import openpyxl as excel # 新規ワークブックを作る — (*1) book = excel.Workbook() # アクティブなワークシートを得る — (*2) sheet = book.active # 連続でセルに値を設定する — (*3) for i in range(10): # セルに値を設定 — (*4) sheet.cell(row=(i+1), column=1, value=i) # ファイルを保存 — (*5) book.save(“renzoku.xlsx”) |
(中略)
プログラムの1では新規ブックを作成します。そして、2ではブックのアクティブなシートを表すオブジェクトを取得します。
3以降の部分ではfor文を利用して連続で値を書き込みます。ここでは、range(10)と書いていますので、0、1、2、3…9と連続する値を変数iに設定して繰り返します。4の部分では、cellメソッドを利用してセルに値を設定します。cellに与える名前付き引数の内、rowには1から始まる行番号を指定したいので、i+1を指定します。これにより、1行目から順に書き込んでいきます。
————————
これを実行した結果がこちら。ファイルは.pyファイルがあるのと同じフォルダに保存されます。

これを応用して、九九表を作ります。
先ほどの[for i in range(10):]の部分を以下のように書き換えます。以下もサンプルコードですが、最初と最後は同じなので変更するところだけ抜き出しています。
(ファイル名はサンプルコードでは9×9.xlsxになっていました。)
for y in range(1, 10): for x in range(1, 10): # セルを取得 — (*4) cell = sheet.cell(row=y, column=x) # 九九の値を設定 — (*5) cell.value = x * y |
range(1, 10)となっていますので、1~9の値を順番にrow=yとcolumn=xに代入していきます。行方向と列方向のfor文を重ねることで入れ子状態にすることができるそうです。これで9×9までの計算結果を入れたExcelが完成します。
ちなみにセル番号の指定は(行, 列)という順番で指定してあげればいいので、[cell = sheet.cell(row=y, column=x)]の部分を[cell = sheet.cell(y, x)]にしてもOKです。
出来上がったのがこちら。

九九表以上のものが欲しいというのであれば、[range(1, 10)]を[range(1, 21)]にしたり、[range(10, 20)]にしたり、というように変えてあげれば広げることができます。サンプルコードとして、20×20のものがありましたので一応ご紹介。
for y in range(1, 21): for x in range(1, 21): # セルを取得 — (*4) cell = sheet.cell(row=y, column=x) # 九九の値を設定 — (*5) cell.value = x * y |
結果がこちら。

openpyxlのcoordinateプロパティでセル番号を簡単に取得する方法
ところで、パパっと行列番号が出てくれば苦労することはありません。いちいち数えるのも面倒ですし。
簡単にセル番号を取得する方法として、coordinateプロパティというものがあるそうです。
教科書では次のコードが紹介されています。
————————
P.53
import openpyxl as excel book = excel.Workbook() sheet = book.active # 連続でセルに値を設定する for y in range(1,101): for x in range(1,101): cell = sheet.cell(row=y, column=x) cell.value = cell.coordinate # セル名 # ファイルを保存 book.save(“test100.xlsx”) |
————————
10行目にある部分ですね。これを実行するとこんなExcelが作成されます。

こちらのコードでは各セルのセル番号を計算?取得して、セルに書き込んでいます。
練習として、特定のセル番号だけを取得して表示するようなものを作ってみました。
また、特定セルの行列番号を取得する方法もありましたので、こちらも併せてやってみました。

実行すると「C9」「3」「1」と結果が印字されます。
それではきりが良いのでこちらで終了です。今回もお付き合いいただき、ありがとうございました。
Pythonの自動化で業務の効率化を図りたい方は、グローバルウェイに依頼してみてはいかがでしょうか?興味がある方は以下をご覧の上、是非お問い合わせください。
