PythonでExcelを扱うための便利なモジュールとして「openpyxl」と「pywin32」があります。本記事ではopenpyxlを使います。
pywin32はExcelがインストールされている必要があるのに対して、openpyxlはExcelがインストールされている必要がありません。
そのためopenpyxlであればExcelがインストールされていないWindowsパソコンだけでなくLinuxでもPythonでExcelを扱う亊が可能となります。大量のExcelファイルをLinuxサーバー上で一括処理するような場合は特に有効です。
ここから先、パッケージのインストールなど行いますので環境を整えていない方は以下の記事をご覧ください。社内パソコンで環境を構築する方は参考になると思います。
タップできる目次
openpyxlでExcelファイルを扱う方法
最初にパッケージをインストールしておきます。次のコマンドでインストールできます。
python -m pip install openpyxl
openpyxlでExcelファイルを読み書きする
簡単な例として、A1セルに「これはA1セルです」という文字列を書き込んで保存してみます。
# 先ほどインストールしたモジュールを読み込む
import openpyxl
# Excelファイルを新規作成
book = openpyxl.Workbook()
# アクティブなシートにアクセス
sheet = book.active
# A1セルに文字列を書き込む
sheet["A1"] = "ここはA1セルです"
# Excelファイルを保存する
book.save("myExcel.xlsx")
このスクリプトを「write_excel.py」というファイル名で保存し実行するとExcelファイルが新規に作成されます。
python write_excel.py
実行したらExcelファイルを開いてみましょう。
このようにA1セルに「ここはA1セルです」と書かれているはずです。
それでは次にExcelファイルを読み込んで、内容を表示してみましょう。
# 先ほどインストールしたモジュールを読み込む
import openpyxl
# Excelファイルを開く
book = openpyxl.load_workbook("myExcel.xlsx")
# シート名を指定してアクセスする(シート名は「Sheet」)
sheet = book["Sheet"]
# A1のセルの内容を読み込む
cell = sheet["A1"]
# 読み込んだ内容を表示する
print(cell.value)
このスクリプトを「read_excel.py」というファイル名で保存し実行すると次のようにセルの内容が表示できます。
> python read_exel.py ここはA1セルです
こんな簡単にExcelファイルの読み書きができるんです。
openpyxlで実行できる亊
openpyxlパッケージを読み込む
import openpyxl
ファイル操作
Excelファイルを新規作成する
book = openpyxl.Workbook()
Excelファイルを読み込む
book = openpyxl.load_workbook("myfile.xlsx")
Excelファイルを保存する
book.save("myfile.xlsx")
book.save("anothoer-myfile.xlsx")
ワークシートの操作
シートにアクセスする
sheet = book["sheet"]
sheet = book.worksheets[0]
シート名を取得・変更する
book.sheetnames
sheet.title
シート名を変更する
sheet.title = "他のシート名"
シートを追加する
new_sheet = book.create_sheet(title="新しいシート")
# 先頭(index番号「0」)にシートを追加 ※末尾なら「-1」
new_sheet = book.create_sheet(title="新しいシート", index=0)
シートをコピーする
copy_sheet = book.copy_worksheet(book["コピー元シート名"])
シートを削除する
book.remove(book["削除したいシート名"])
# 先頭(index番号「0」)のシートを削除 ※末尾なら「-1」
book.remove(book.worksheets[0])
シート数をカウントする
nsheets = len(book.worksheets)
セルの操作
セルにアクセスする
cell_A1 = sheet["A1"]
cell_A1 = sheet.cell(row=1, column=1)
#あるいは次のように指定できる
cell_A1 = sheet.cell(1, 1)
複数のセルを範囲指定してアクセスする
cell_range = sheet["A1:Z10"]
複数のセルを行指定する
# 1行目にアクセス
cell_row = sheet[1]
セルのアドレス・行番号・列番号を取得する
cell.coordinate
cell.row
cell.column
セルの内容を取得する
cell_val = cell.value
セルに書き込む
cell.value = "文字列"
cell.value = 123
手を動かしてみよう
それでは実際にプログラミングしてExcelファイルをいじってみましょう。
練習用に次のようなExcelファイルを用意しました。A列は氏名でB列は住所が記載されているファイルです。シート操作もしてみたいので「住所録1」「住所録2」「住所録3」というシート名を付けて保存しています。
「住所録2」は氏名の後ろに「-2」を付けているだけで内容は同じです。「住所録3」は氏名の後ろに「-3」を付けています。
特定のシートからデータを取得する
それでは名前と住所を「住所録2」シートから取得して表示するスクリプトを書いて見ましょう。
# モジュールを読み込む
import openpyxl
# Excelファイルを開く
book = openpyxl.load_workbook("アドレス帳.xlsx")
# シート名を指定する
#sheet = book["住所録2"]
# インディックス番号で「住所録2」を指定する
sheet = book.worksheets[1]
print("シート名は「" + sheet.title + "」です")
print("=== 表示形式1 ===")
for row in sheet["A2:B4"]:
print([cells.value for cells in row])
print()
print("=== 表示形式2 ===")
for row in sheet["A2:B4"]:
name, address = [cells.value for cells in row]
print(name + "さんの住所は" + address + "です")
このスクリプトを実行すると次のように表示されます。
> python main.py シート名は「住所録2」です === 表示形式1 === ['山田太郎-2', '東京都新宿区'] ['鈴木次郎-2', '東京都世田谷区'] ['佐藤一郎-2', '東京都豊島区'] === 表示形式2 === 山田太郎-2さんの住所は東京都新宿区です 鈴木次郎-2さんの住所は東京都世田谷区です 佐藤一郎-2さんの住所は東京都豊島区です >
シートは sheet = book["住所録2"]
として名前を指定する亊ができますし、sheet = book.worksheets[1]
のようにインディックス番号を指定する亊が可能です。なぜインディックス番号が「1」かというと一番左(住所録1)がインディックス番号「0」で2番目の住所録2がインディックス番号「1」となるからです。
セルの内容に順次アクセスするには for row in sheet["A2:B4"]
で行単位でアクセスし、name, address = [cells.value for cells in row]
で氏名と住所を取得しています。
for row in sheet["A2:B4"]: name, address = [cells.value for cells in row] print(name + "さんの住所は" + address + "です")
複数のシートからデータを取得する
先ほどは「住所録2」のみアクセスしていました。
これを発展させて「住所録1」「住所録2」「住所録3」に順次アクセスして氏名と住所を取得してみます。
Excelブックからシート名一覧を取得し、順次アクセスする方法でデータを取得してみましょう。
# モジュールを読み込む
import openpyxl
# Excelファイルを開く
book = openpyxl.load_workbook("アドレス帳.xlsx")
for sheet_name in book.sheetnames:
sheet = book[sheet_name]
print("シート名は「" + sheet.title + "」です")
for row in sheet["A2:B4"]:
name, address = [cells.value for cells in row]
print(name + "さんの住所は" + address + "です")
print()
このスクリプトを実行すると次のように表示されます。
> python main.py シート名は「住所録1」です 山田太郎さんの住所は東京都新宿区です 鈴木次郎さんの住所は東京都世田谷区です 佐藤一郎さんの住所は東京都豊島区です シート名は「住所録2」です 山田太郎-2さんの住所は東京都新宿区です 鈴木次郎-2さんの住所は東京都世田谷区です 佐藤一郎-2さんの住所は東京都豊島区です シート名は「住所録3」です 山田太郎-3さんの住所は東京都新宿区です 鈴木次郎-3さんの住所は東京都世田谷区です 佐藤一郎-3さんの住所は東京都豊島区です >
このように「住所録1」「住所録2」「住所録3」から氏名と住所を引き出す亊ができました。
まとめ
PythonでExcelファイルを取り扱う際の基本的な機能を解説しました。とても簡単にExcelファイルを扱えることが分かって頂けたかと思います。
あとはアイデア次第で様々な作業を自動化し業務効率化を図る亊ができるようになるでしょう。