Pythonのエクセル操作

プログラミング

Pythonではエクセルファイルを操作して、データを集計したり、帳票を作ったりすることができます。

これまでエクセルのマクロで行っていたような操作をPythonを使って行うことができるのです。

本記事では、Pythonを使ったエクセルファイルの操作方法について解説します。

記事内に記載しているプログラムは、Python3.6.8を使って動作確認をしています。

Pythonのエクセル操作

Pythonのエクセル操作として以下の内容について解説します。

  • エクセル操作を行うライブラリ
  • ワークブックの操作
  • ワークシートの操作
  • セルの操作
  • セルのスタイル

エクセル操作を行うライブラリ

Pythonでエクセル操作をするには、外部で提供されているライブラリをインストールして行います。

ライブラリにはいくつかの種類があります。

  • openpyxl
    • 「.xlsx」形式のファイルに対応していて、シートやセルなどの実際のエクセルの構成を意識した操作を行うことができます。
  • pandas
    • データ解析用のライブラリとして使われ、エクセルを操作する場合は、表や行、列といったデータの塊に対して操作を行うイメージとなります。
    • 他のエクセル用ライブラリと組み合わせて使われることが多く、「.xlsx」「.xls」形式のどちらでも操作することが可能です。
  • xlwings
    • xlwingsに加えてエクセルのアドインをインストールすることで、エクセルからPythonを呼出して操作することができます。
    • Linux環境では利用できません。
  • pywin32
    • PythonからエクセルのVBAを呼び出すことでエクセル操作を行うことができます。
    • Windowsでのみ利用可能です。

本記事では、様々なプラットフォームで動作し、エクセル感覚で操作できる openpyxl を使います。

ワークブックの操作

openpyxlを利用するには、まずインストールを行います。
Python3を利用している場合は、以下のコマンドでインストールします。

pip3 install openpyxl

インストール出来たら、プログラムの先頭でimportします。

import openpyxl

以上で準備OKです。

まずは、ワークブックを作成して保存します。

wb = openpyxl.Workbook()
wb.save("test_excel1.xlsx")

実行すると、test_excel1.xlsx というファイルが実行したディレクトリに作成されます。
すでに同名のファイルが存在する場合は、新規にファイルを作成して上書きを行います。

既存のワークブックを読み込む場合は、以下のように行います。

wb = openpyxl.load_workbook("test_excel1.xlsx")

ワークシートの操作

ワークブックを新規に作成すると、自動的に1つのワークシートが作成されます。
ワークシートの操作は以下のように行います。

シート名の確認

操作対象のワークブックに存在するシート名を確認するには以下のように行います。
シート名が配列で返されます。

print(wb.sheetnames) # -> ['Sheet']

操作対象のシートを選択

操作するワークシートを選択するには、シート名を指定するか、インデックスを指定します。

ws = wb["Sheet"] # シート名で指定

ws = wb.worksheets[0] # インデックスで指定

シートの追加

新規にシートを追加するには以下のように行います。
デフォルトでは末尾に追加されます。インデックスを指定して任意の場所へ追加することも可能です。

wb.create_sheet(title="Sheet2")
print(wb.sheetnames) # -> ['Sheet', 'Sheet2']

wb.create_sheet(title="Sheet3", index=1)
print(wb.sheetnames) # -> ['Sheet', 'Sheet3', 'Sheet2']

シートのコピー

シートをコピーするには以下のように行います。
コピーしたシートは末尾に追加され、シート名の末尾に「 Copy」が付きます。

wb.copy_worksheet(wb["Sheet"])
print(wb.sheetnames) # -> ['Sheet', 'Sheet3', 'Sheet2', 'Sheet Copy']

シートの削除

シートを削除するには以下のように行います。
シート名を指定したり、インデックスを指定して削除することができます。

wb.remove(wb["Sheet Copy"])
print(wb.sheetnames) # -> ['Sheet', 'Sheet3', 'Sheet2']

wb.remove(wb.worksheets[2])
print(wb.sheetnames) # -> ['Sheet', 'Sheet3']

wb.remove(wb.worksheets[-1])
print(wb.sheetnames) # -> ['Sheet']

セルの操作

セルに対して行う基本操作を解説します。

セルへの書き込み

セルへの書き込みは対象のセルを選択して、valueに値を設定します。

a1 = ws["A1"]
a1.value = "A1データ"

上記のプログラムでは、A1セルに対して、「A1データ」という文字列を書き込んでいます。

行番号と列番号を指定して書き込みも可能です。

ws.cell(row=1, column=2, value="B1データ")

セルの読み込み

セルの値を取得するには、対象のセルを選択して、valueの値を取得します。

a1 = ws["A1"]
a1_data = a1.value
print(a1_data) # -> A1データ

セルの選択は、行番号と列番号を指定しても可能です。

b1 = ws.cell(row=1, column=2)
b1_data = b1.value
print(b1_data) # -> B1データ

数式が指定されている場合の値の取得

数式が入力されているセルを取得すると、数式として取得されます。
数式の結果として値を取得する場合は、以下のようにワークブックを読み込む際に、data_only=Trueを指定します。

wb = openpyxl.load_workbook("test_excel1.xlsx", data_only=True)

行や列による範囲指定

セルを範囲指定で複数取得するには、セルの範囲を直接していすることで可能です。
範囲指定すると、1行分がタプルとなって、それが複数行のタプルとなった二重構造で取得されます。

a2b4 = ws["A2:C4"]
for rows in a2b4:
    for cell in rows:
        cell.value = cell.column_letter + str(cell.row)
    print(cell.value)

上記のプログラムでは、A2からC4の範囲を二重タプルで取得し、二重ループでそれぞれのセルに対して、列名と行番号の文字列(A2など)を書き込んでいます。

全行取得したい場合は、ws.rowsで取得できます。

for row in ws.rows:
    row_data = []
    for cell in row:
        row_data.append(cell.value)
    print(row_data)

上記のプログラムでは、ws.rowsで取得した範囲にある二重タプルを二重ループで回しながら、セルの値をリストに入れて一行分のデータを作成しています。
実行すると以下の結果となります。

['A1データ', 'B1データ', None]
['A2', 'B2', 'C2']
['A3', 'B3', 'C3']
['A4', 'B4', 'C4']

セルのスタイル

フォントや枠線などセルのスタイルを設定することも可能です。

フォント設定

フォントを設定するには、openpyxl.styles.Fontで設定を作成し、適用したいセルのfontに指定します。

font = openpyxl.styles.Font(name="メイリオ", size=14)
ws["A1"].font = font
ws["B1"].font = font

セルの枠線

枠線を入れるには、openpyxl.styles.Borderで設定を作成し、適用したいセルのborderに指定します。

border = openpyxl.styles.Border(
    top=openpyxl.styles.Side(style="thin", color="000000"),
    right=openpyxl.styles.Side(style="thin", color="000000"),
    bottom=openpyxl.styles.Side(style="thin", color="000000"),
    left=openpyxl.styles.Side(style="thin", color="000000")
)

for row in ws["A2:C4"]:
    for cell in row:
        cell.border = border

セルの塗りつぶし

セルを塗りつぶすには、openpyxl.styles.PatternFillで設定を作成し、適用したいセルのfillに指定します。

fill = openpyxl.styles.PatternFill(fill_type="solid", fgColor="FFFF00")
for row in ws["A2:A4"]:
    for cell in row:
        cell.fill = fill

ここまでに適用したスタイルを保存して、Excelで開くと以下の結果となります。

まとめ

まとめると以下のようになります。

  • Pythonでエクセルを操作するライブラリはいくつかあるが、エクセル感覚でデータを操作するには、openpyxlが便利。
  • ワークブック、ワークシート、セルの概念があり、それぞれに応じた操作が可能。
  • スタイルの適用など通常のエクセルの操作をそのままプログラムで再現できる。

今回は基本操作のみの紹介でしたが、普段からエクセルをよく使われる方は、プログラム化することによって業務の自動化も実現できますので、ぜひ挑戦してほしいと思います。

 

今回Pythonでエクセル操作を行う方法を解説しました。

以上、参考になれば幸いです。

コメント

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