エクセルの自動化

pythonと自動化

  1. HOME
  2. Excel

膨大なライブラリがPyPIで公開されている

多くの機能は後から別途インストールして使えるようになっています。
pythonのライブラリは、PyPI (The Python Package lndex)というWebサイトにまとめられています。

「openpyxl」ライブラリーを使って、Excelファイルのシートやセルからデータを取り出したり、また逆にセルにデータを書き出したりと、 さまざまな操作が可能になります。直接Excelファイル(拡張子が「.xlsx」)を操作するライブラリです。
pip install -U openpyxl==3.0.4

基本的な操作

モジュールのimport宣言

# ライブラリを取り込む
import openpyxl as excel

ワークブックを用意する

# 新規ワークブックを作る
book = excel.Workbook()

# 既存のExcelファイルの読み込み
book = excel.load_workbook("ファイル名.xlsx")

# 式があれば展開してワークブックを開く
book = excel.load_workbook("ファイル名.xlsx", data_only=True)

# ワークブックを明示的に閉じる
book.close()

ワークシートを操作するためのオブジェクトを取得する方法

# アクティブなワークシートを得る
sheet = book.active

# n番目のシートを得る
sheet = book.worksheets[n]

# シート名を指定して取得
sheet = book["シート名"]

# ブック内のシート名の一覧を取得
print(book.sheetnames)

# 新規シートを作成
sheet = book.create_sheet(title="シート名")

# 既存のシートをコピーして取得
sheet = book.copy_worksheet(book["シート名"])

# シート名を変更する
sheet.title = "新しい名前"

# シートを削除
book.remove(book["シート名"])

セル名を指定する方法

# A1のセルに値を設定
sheet["A1"] = "こんにちは"

# 行番号と列番号を指定して値を設定(rowとcolumnは1起点)
sheet.cell(row=行番号, column=列番号, value="こんにちは")

# 先に任意のセルを取得し、セルに値を設定する方法
cell = sheet.cell(row=行番号, column=列番号)
cell.value = "こんにちは"

# シートの値を読む
print(sheet["A1"].value)

# 行番号と列番号を指定して値を取得
v = sheet.cell(row=行番号, column=列番号).value
print(v)

ファイルを保存

# ファイルを保存
book.save("hello.xlsx")

iter_rowsで繰り返し指定範囲を取得

# 行番号と列番号を指定してイテレータを取得
it = sheet.iter_rows(
    min_row=最小行, max_row=最大行,
    min_col=最小列, max_col=最大列
)

# for文と組み合わせてセルの値を取得
for row in it:
    for cell in row:
        print(cell.value)
pythonのイテレータはfor文と組み合わせて使い要素を反復して値を取り出す機能です。

年齢生年対応表

import openpyxl as excel
import datetime

book = excel.Workbook()
sheet = book.active

thisyear = datetime.date.today().year

for i in range(80):
    age = i
    year = thisyear - i

    age_cell = sheet.cell(i+1, 1)
    age_cell.value = str(i) + "歳"
    year_cell = sheet.cell(i+1, 2)
    year_cell.value = str(year) + "年"

    book.save("agelist.xlsx")

西暦和暦の対応表

import openpyxl as excel

# 西暦と和暦の対応テーブル
wareki_table = [
    {"name": "明治", "start": 1868, "end": 1912},
    {"name": "大正", "start": 1912, "end": 1926},
    {"name": "昭和", "start": 1926, "end": 1989},
    {"name": "平成", "start": 1989, "end": 2019},
    {"name": "令和", "start": 2019, "end": 9999}
]
# 西暦から和暦へ変換する関数を定義


def seireki_wareki(year):
    for w in wareki_table:
        if w["start"] <= year < w["end"]:
            y = str(year - w["start"] + 1) + "年"
            if y == "1年":
                y = "元年"
            return w["name"] + y
    return "不明"


# 新規ワークブックを作る
book = excel.Workbook()
sheet = book.active
# シートのヘッダ部分の説明を入れる
sheet["A1"] = "西暦"
sheet["B1"] = "和暦"

# 100年分の西暦和暦の対応表を作る
start_y = 1868
for i in range(180):
    sei = start_y + i
    wa = seireki_wareki(sei)
    # シートに設定
    sheet.cell(row=2+i, column=1, value=str(sei)+"年")
    sheet.cell(row=2+i, column=2, value=wa)
    print(sei, "=", wa)

book.save("wareki.xlsx")