Python

【OpenPyXL】PythonでExcelを自動操作する方法

2023年1月8日

Pythondでエクセルを操作

Excel操作を自動化したいと思ったことはありませんか?

『Excelを仕事で使っているが、毎回同じ単純な操作』
『大量にデータを入力しているが、ミスしそう』
そんな悩みがPythonを使えばほんの一瞬で解決できます。

毎日、日経平均やGAFAMの株価チャートをPythonで出力して
自動でエクセルに貼り付けいている僕が
解説していきます。

【OpenPyXL】PythonでExcel操作を自動化

エクセル自動操作

Excelを操作するPythonのモジュールは多数存在しますが、
僕はOpenPyXLをおすすめします。

理由として、ウェブで公開されている情報が多いからです。
ネットで調べながらプログラムを書く方も多いと思うので
情報が多いに越したことはありません。

OpenPyXLの使い方について以下の内容で解説してきます。

OpenPyXLの使い方

  • ①モジュールのインストール
  • ②Excelのファイルを読み込む
  • ③Excelにデータを書き込む

①モジュールのインストール

まずはモジュールのインストールです。

pip install openpyxl

Anacondaを使用している方は最初からインストールされているはずですが、
されてなければpip install openpyxlでインストールしましょう。

②Excelのファイルを読み込む

エクセルテスト1

上のようなExcelファイルを読み込んでいきます。

まずはコード全体を紹介します。

import openpyxl

# ブック取得
directry='C:/Document/メカタナブログ/'
wb = openpyxl.load_workbook(directry+'test.xlsx', data_only=True, keep_vba=False)

# シートを取得
sheet = wb["Sheet1"]

# セルを取得
cell_A1_1 = sheet["A1"].value
cell_A1_2 = sheet.cell(row=1, column=1).value
cell_A1_3 = sheet.cell(1,1).value

cell_A2_1 = sheet["A2"].value
cell_A2_2 = sheet.cell(row=2, column=1).value
cell_A2_3 = sheet.cell(2,1).value

print("cell_A1_1=" + cell_A1_1)
print("cell_A1_2=" + cell_A1_2)
print("cell_A1_3=" + cell_A1_3)

print("cell_A2_1=" + cell_A2_1)
print("cell_A2_2=" + cell_A2_2)
print("cell_A2_3=" + cell_A2_3)
import openpyxl

# ブック取得
directry='C:/Document/メカタナブログ/'
wb = openpyxl.load_workbook(directry+'test.xlsx', data_only=True, keep_vba=False)

プログラムの先頭にimport openpyxlと記載します。

Excelファイルを読み込むために、対象ファイルが保管されている
ディレクトリをdirectry='C:/Document/メカタナブログ/'
指定し、'test.xlsx'で対象のファイル名を記載してください。
※ディレクトリは保存されている場所に変更してください。

data_only=TrueはもしExcelファイルに計算式を記入していれば結果を取得します。
data_onlyFalseにすると数式を取得します。
※デフォルトはFalseです。

keep_vba=Trueを記載しないとマクロが保持されません。
keep_vbaFalseにしてブックを開き、そのまま保存するとマクロが消えるので注意しましょう。
※デフォルトはFalseです。

また、マクロが設定されていないファイルをkeep_vba=Trueで読み込んで保存すると
ファイルが壊れて読み込めなくなります。

なのでマクロを設定していればkeep_vba=True
マクロを設定していなければkeep_vba=Falseと記載しましょう。

これで読み込むファイルとシートが指定できたので、
今度はセルの値を取得します。

# セルを取得
cell_A1_1 = sheet["A1"].value
cell_A1_2 = sheet.cell(row=1, column=1).value
cell_A1_3 = sheet.cell(1,1).value

cell_A2_1 = sheet["A2"].value
cell_A2_2 = sheet.cell(row=2, column=1).value
cell_A2_3 = sheet.cell(2,1).value

print("cell_A1_1=" + cell_A1_1)
print("cell_A1_2=" + cell_A1_2)
print("cell_A1_3=" + cell_A1_3)

print("cell_A2_1=" + cell_A2_1)
print("cell_A2_2=" + cell_A2_2)
print("cell_A2_3=" + cell_A2_3)

セルの値を取得するには3つの方法があります。

1つ目がsheet["A1"].valueと記載するとA列1行目を取得します。
一番分かりやすいと思います。

2つ目がsheet.cell(row=1, column=1).valueと記述すれば
何行目の何列の値を取得するように指示できるので
for文と組み合わせると大量のデータを読み込むこともできます。
rowは行、columnは列となります。

3つ目は2つ目と似ており、rowcolumnを取り除けば
大丈夫です。
※僕はどっちが行で列か分からなくなるので、2つ目の
 rowcolumnを記載しています。

エクセルテスト2

A1A2のセルの値を正しく取得出来たら、
上のような結果になります。

ただ、セルの値をそれぞれ指定して取得は現実的でなないので
for文を使ってA列を一括取得します。

まずはコード全体を紹介します。

import openpyxl

# ブック取得
directry='C:/Document/メカタナブログ/'
wb = openpyxl.load_workbook(directry+'test.xlsx', data_only=True, keep_vba=False)

# シートを取得
sheet = wb["Sheet1"]

# A列のセルをすべて取得
max_row=sheet.max_row+1
for i in range(1,max_row):
    cell_A = sheet.cell(row=i, column=1).value
    print("cell_A" + str(i) + "=" + cell_A)

先程と被る部分は解説を割愛します。

# A列のセルをすべて取得
max_row=sheet.max_row+1

sheet.max_rowと記載すれば値が入力されている最大行を取得します。
+1for文で最後の行まで処理するために記述しています。

for i in range(1,max_row):
    cell_A = sheet.cell(row=i, column=1).value
    print("cell_A" + str(i) + "=" + cell_A)

for i in range(1,max_row):で1行目から値が入力されている最大行まで
同じ処理を繰り返すと宣言します。

例えば、今回は4行まで取得するので、4回同じ処理を実行します。

cell_A = ws.cell(row=i, column=1).valueA列i行目の値を取得します。

エクセルテスト3

正しく取得出来たら、上のような結果になります。

③Excelにデータを書き込む

エクセル書き込み

読み込みができたら書き込みは簡単です。

Excelのファイルを読み込みと同様に
for文と組み合わせれば大量のデータをExcelに書き込むことができます。

例として先程取り込んだA列の値をB列に書き出します。

import openpyxl

# ブック取得
directry='C:/Document/メカタナブログ/'
wb = openpyxl.load_workbook(directry+'test.xlsx', data_only=True, keep_vba=False)

# シートを取得
sheet = wb["Sheet1"]

# A列のセルをすべて取得後、B列に書き込み
max_row=sheet.max_row+1
for i in range(1,max_row):
    cell_A = sheet.cell(row=i, column=1).value
    cell_B = sheet.cell(row=i, column=2, value=cell_A)
    print("cell_A" + str(i) + "=" + cell_A)
    print("cell_B" + str(i) + "=" + cell_B.value)

# 上書き保存
wb.save(directry+"test.xlsx")
エクセルテスト4

sheet.cell(row=i, column=2, value=cell_A)rowcolumn
書き込むセルを指示し、value=で入力する値を記述すれば完了です。

最後にwb.save(directry+"test.xlsx")で上書き保存しています。
また、"test.xlsx"を別ファイル名にすれば別名保存ができます。

今回はOpenPyXLを使ってExcelファイルの読み書きについて
紹介させていただきました。

画像の貼り付けやグラフ作成について別記事で紹介します。

今回は以上です。

  • この記事を書いた人

メカタナ

副業ブロガー【経歴】関西出身▶︎理系国立大学院▶︎東証プライム上場企業メーカー開発職▶︎妻と息子1人と暮らしています。▶︎メカタナブログを開設⇒仕事や日常で役立つPythonプログラムを紹介していきます!

-Python