はじめに

こんにちは!エンジニアリングソリューション事業部のABEです。
好きな色はモノトーンカラーと黄色です。
私は2020年に新卒未経験として入社し、現在はPythonやRobot Frameworkを使用して
ネットワーク機器の検証を自動化するプロジェクトに携わっています。

本記事では、前回のテキストファイル編に引き続きPythonを使用してファイル操作を自動化する方法を紹介します。




これから紹介するファイル操作の方法で、Excelファイルに入力された値を読み込み、
その値を使用してテキストファイルに自動で出力する、といったことも簡単にできる
ので、是非最後まで読んでいただけると嬉しいです。
今回はExcelファイル編です!

目次

1. 実装環境
2. Excelファイルの読み込み
 2-1. ファイル全体の読み込み
 2-2. 対象シートの読み込み
 2-3. 対象セルの読み込み

3. Excelファイルの修正、書き込み
 3-1. 対象シートの修正
 3-2. 対象セルの修正、書き込み
 3-3. Excelファイルの保存

4. 活用例
5. 最後に
6. 参考資料

1. 実装環境

・Python 3.8.7
 事前準備としてpipコマンドでopenpyxlライブラリをインストールしておきます。

pip install openpyxl

2. Excelファイルの読み込み

以下の値が記載されているsample.xlsx使用してExcelファイルの読み込みを
していきましょう。

サンプルExcelファイル

2-1. ファイル全体の読み込み

まず始めに、openpyxlライブラリのload_workbook()メソッドを使用して
Excelファイルのオブジェクトを取得します。
この時、load_workbook()メソッドの引数には対象ファイルへのパス(絶対パス /
相対パスどちらでも可)を指定します。

以下のようにload_workbook()メソッドはWorkbookオブジェクトを返却するので、
このオブジェクトを使用して以降の手順でExcelファイルの読み込みをしていきます。

import openpyxl

file_path = "/hoge/hoge/sample.xlsx"
wb = openpyxl.load_workbook(file_path)
print(type(wb))  # <class 'openpyxl.workbook.workbook.Workbook'>

2-2. 対象シートの読み込み

Excelファイル全体を取得したので、次はシートを取得してみましょう。

先ほど取得したWorkbookオブジェクトに対して[シート名]を指定することで、Worksheetオブジェクトを取得することができます。
また、Workbookオブジェクトのsheetnames属性を使用することでシート名の一覧を
リストで取得することもできます。

file_path = "/hoge/hoge/sample.xlsx"
wb = openpyxl.load_workbook(file_path)
print(type(wb))  # <class 'openpyxl.workbook.workbook.Workbook'>

ws = wb["Sample_Sheet1"]
print(type(ws))  # <class 'openpyxl.worksheet.worksheet.Worksheet'>

# シート名を一覧で取得
print(wb.sheetnames)  # ['Sample_Sheet1', 'Sample_Sheet2']

2-3. 対象セルの読み込み

最後は、取得したシートからセルの値を読み込んでみましょう。

先ほど取得したWorksheetオブジェクトに対して[セル名]を指定することで、
Cellオブジェクトを取得することができます。
この時、[“A1:A4”]といった指定をすれば複数のCellオブジェクトの取得も可能です。

そして、そのCellオブジェクトのvalue属性を使用することでセルに記載されている値を
取得することができます。

ws = wb["Sample_Sheet1"]
print(type(ws))  # <class 'openpyxl.worksheet.worksheet.Worksheet'>

cell = ws["A1"]
print(type(cell))  # <class 'openpyxl.cell.cell.Cell'>
print(cell.value)  # AAAA

# 複数セル(A1からA4)の取得
cell_list = ws["A1:A4"]
print(cell_list)
# ((<Cell 'Sample_Sheet1'.A1>,), (<Cell 'Sample_Sheet1'.A2>,), (<Cell 'Sample_Sheet1'.A3>,), (<Cell 'Sample_Sheet1'.A4>,))

for cell in cell_list:
    print(cell[0].value)
    # AAAA
    # BBBB
    # CCCC
    # DDDD

3. Excelファイルの修正、書き込み

先ほど紹介した以下の3つのオブジェクトを使用して、今度はExcelファイルの修正や
書き込みを行います。

 ・Workbook
 ・Worksheet
 ・Cell

3-1. 対象シートの修正

Worksheetオブジェクトのtitle属性を使用することで、シート名の修正ができます。
以下の例では「Sample_Sheet1」のシート名が「Sample_SheetA」に修正されます。

wb = openpyxl.load_workbook(file_path)

ws = wb["Sample_Sheet1"]
ws.title = "Sample_SheetA"

# シート名を一覧で取得
print(wb.sheetnames)  # ['Sample_SheetA', 'Sample_Sheet2']

また、Workbookオブジェクトの以下の3つのメソッドを使用することで、
シートの追加・コピー・削除をすることができます。

 ・create_sheet()
 ・copy_worksheet()
 ・remove()

# シートの追加
wb.create_sheet("Sample_Sheet3")
print(wb.sheetnames)  # ['Sample_Sheet1', 'Sample_Sheet2', 'Sample_Sheet3']

# シートのコピー
wb.copy_worksheet(wb["Sample_Sheet3"])
print(wb.sheetnames)  # ['Sample_Sheet1', 'Sample_Sheet2', 'Sample_Sheet3', 'Sample_Sheet3 Copy']

# シートの削除
wb.remove(wb["Sample_Sheet3 Copy"])
print(wb.sheetnames)  # ['Sample_Sheet1', 'Sample_Sheet2', 'Sample_Sheet3']

3-2. 対象セルの修正、書き込み

Cellオブジェクトに対して別の値を指定することでセルの中身を修正することが
できます。

以下の例ではA1セルの「AAAA」の値が「aaaa」に修正されます。
また、A5セルの例のように中身が空のセルを指定すれば新たに値を書き込むことも
できます。

ws = wb["Sample_Sheet1"]

# 値の修正
print(ws["A1"].value) # AAAA
ws["A1"] = "aaaa"
print(ws["A1"].value)  # aaaa

# 値の追加
ws["A5"] = "EEEE"
print(ws["A5"].value)  # EEEE

3-3. Excelファイルの保存

最後に、Workbookオブジェクトのsave()メソッドを使用することで
読み込んだExcelファイルを保存することができます。
現在と同じファイルを指定すれば上書き保存され、存在しないファイルを指定すれば
新規のExcelファイルが作成されます。

これまでの修正を実行しても最後に保存しなければファイルには反映されないので、
保存したい場合はsave()メソッドを使うのを忘れないようにしましょう。

file_path = "/hoge/hoge/sample.xlsx"
wb = openpyxl.load_workbook(file_path)

# 上書き保存
wb.save("/hoge/hoge/sample.xlsx")
# 新規作成
wb.save("/hoge/hoge/sample2.xlsx")

4. 活用例

では、これまでに紹介したExcelファイルへの読み書き処理を実際に活用して
みましょう!
ここでは、前回のテキストファイル編で紹介した文字列置換と組み合わせる方法を
Excelファイルバージョンで紹介します。

以下の例では、複数のCellオブジェクトを取得し、replace()メソッドを使用して
セルの値に「CCCC」の文字列があれば「EEEE」に書き換えて上書き保存しています。

file_path = "/hoge/hoge/sample.xlsx"
wb = openpyxl.load_workbook(file_path)
ws = wb["Sample_Sheet1"]

# セルの範囲を指定して複数のCellオブジェクトを取得
cell_list = ws["A1:A4"]

# 修正前
for cell in cell_list:
    print(cell[0].value)
    # AAAA
    # BBBB
    # CCCC
    # DDDD

for cell in cell_list:
    result = cell[0].value.replace("CCCC", "EEEE")
    cell[0].value = result

# 修正後
for cell in cell_list:
    print(cell[0].value)
    # AAAA
    # BBBB
    # EEEE
    # DDDD

# 上書き保存
wb.save("/hoge/hoge/sample.xlsx")

また前回同様、正規表現を使用すれば特定の条件に一致する文字列を書き換えることも
可能です。
以下の例では先ほど書き換えた文章のうち「E」で始まる文字列、つまり「EEEE」を
「CCCC」に書き換えています。

この時、reモジュールのインポートを忘れないようにしましょう。
※正規表現の詳細については以下を参照
 https://www-creators.com/archives/4278

import re

file_path = "/hoge/hoge/sample.xlsx"
wb = openpyxl.load_workbook(file_path)
ws = wb["Sample_Sheet1"]

# セルの範囲を指定して複数のCellオブジェクトを取得
cell_list = ws["A1:A4"]

# 修正前
for cell in cell_list:
    print(cell[0].value)
    # AAAA
    # BBBB
    # EEEE
    # DDDD

for cell in cell_list:
    result = re.sub(r"E+", "CCCC", cell[0].value)
    cell[0].value = result

# 修正後
for cell in cell_list:
    print(cell[0].value)
    # AAAA
    # BBBB
    # CCCC
    # DDDD

# 上書き保存
wb.save("/hoge/hoge/sample.xlsx")

このように、置換処理と組み合わせることで指定した文字列のみ書き換えてファイルを
保存する処理を自動化することができます!

5. 最後に

以上がPythonを使用してExcelファイルの操作を自動化する方法です。

前回から2回に分けてPythonを使用したファイル操作の自動化方法を紹介しましたが、
いかがでしたでしょうか?
Pythonを学習中の方や、業務でよくファイル修正などを行う方にとって、少しでも
参考になっていれば幸いです。

最後までお読みいただきありがとうございました!

6. 参考資料