誰でも簡単!Python3でExcelを扱う超基本

PythonでExcelを扱うための便利なモジュールとして「openpyxl」と「pywin32」があります。本記事ではopenpyxlを使います。

pywin32はExcelがインストールされている必要があるのに対して、openpyxlはExcelがインストールされている必要がありません。

そのためopenpyxlであればExcelがインストールされていないWindowsパソコンだけでなくLinuxでもPythonでExcelを扱う亊が可能となります。大量のExcelファイルをLinuxサーバー上で一括処理するような場合は特に有効です。

ここから先、パッケージのインストールなど行いますので環境を整えていない方は以下の記事をご覧ください。社内パソコンで環境を構築する方は参考になると思います。

会社のパソコンにPython3をインストールする

openpyxlでExcelファイルを扱う方法

最初にパッケージをインストールしておきます。次のコマンドでインストールできます。

python -m pip install openpyxl

openpyxlでExcelファイルを読み書きする

簡単な例として、A1セルに「これはA1セルです」という文字列を書き込んで保存してみます。

write_excel.py
# 先ほどインストールしたモジュールを読み込む
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ファイルを読み込んで、内容を表示してみましょう。

read_excel.py
# 先ほどインストールしたモジュールを読み込む
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パッケージを読み込む

openpyxlパッケージを読み込む
import openpyxl

ファイル操作

Excelファイルを新規作成する
Excelファイルを新規作成する
book = openpyxl.Workbook()
Excelファイルを読み込む
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)

セルの操作

セルにアクセスする
A1セルをアドレスでアクセス
cell_A1 = sheet["A1"]
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」シートから取得して表示するスクリプトを書いて見ましょう。

住所録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ファイルを扱えることが分かって頂けたかと思います。

あとはアイデア次第で様々な作業を自動化し業務効率化を図る亊ができるようになるでしょう。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)