PythonでExcelを操作すれば、高度な自動化が可能です。
Python×Excel入門【openpyxlで業務自動化】
この記事では、openpyxlライブラリを使ったExcel操作の基礎を解説します。
PythonでExcelを扱うメリット
VBAとの比較
| 項目 | VBA | Python |
|---|---|---|
| 実行環境 | Excelのみ | どこでも |
| ライブラリ | 限定的 | 豊富 |
| 大量データ | 遅い | 高速 |
| 他システム連携 | 困難 | 容易 |
| 学習コスト | 低 | 中 |
Pythonが向いているケース
- 大量データの処理
- 複数ファイルの一括処理
- 他システムとの連携
- AIとの連携
- クロスプラットフォーム
環境構築
ライブラリのインストール
bash
pip install openpyxl
動作確認
python
import openpyxl
print(openpyxl.__version__)
関連ライブラリ
| ライブラリ | 用途 |
|---|---|
| openpyxl | .xlsx読み書き |
| xlrd | .xls読み取り(旧形式) |
| pandas | データ分析 |
| xlwings | VBA連携 |
基本操作
ワークブックの作成
python
from openpyxl import Workbook
# 新規ワークブック作成
wb = Workbook()
ws = wb.active # アクティブシート
# セルに値を設定
ws['A1'] = "Hello"
ws['B1'] = "World"
# 保存
wb.save("sample.xlsx")
ワークブックの読み込み
python
from openpyxl import load_workbook
# ファイルを開く
wb = load_workbook("sample.xlsx")
ws = wb.active
# 値を取得
print(ws['A1'].value)
シートの操作
python
# シートの一覧
print(wb.sheetnames)
# シートを取得
ws = wb["Sheet1"]
# シートを追加
ws_new = wb.create_sheet("新しいシート")
# シートを削除
del wb["Sheet1"]
# シート名を変更
ws.title = "データ"
データの読み書き
セルの参照
python
# 方法1: アドレス指定
cell = ws['A1']
value = cell.value
# 方法2: 行・列指定
cell = ws.cell(row=1, column=1)
value = cell.value
# 値の設定
ws['A1'] = "値"
ws.cell(row=1, column=2, value="値2")
範囲の操作
python
# 範囲を取得
for row in ws['A1:C3']:
for cell in row:
print(cell.value)
# 行ごとに取得
for row in ws.iter_rows(min_row=1, max_row=10, min_col=1, max_col=3):
print([cell.value for cell in row])
# 列ごとに取得
for col in ws.iter_cols(min_row=1, max_row=10, min_col=1, max_col=3):
print([cell.value for cell in col])
データの追加
python
# 行を追加
ws.append([1, 2, 3])
ws.append(["A", "B", "C"])
# 複数行を追加
data = [
[1, "田中", 100],
[2, "鈴木", 200],
[3, "佐藤", 150]
]
for row in data:
ws.append(row)
最終行・列の取得
python
# 最終行
last_row = ws.max_row
# 最終列
last_col = ws.max_column
# データがある範囲をループ
for row in range(1, ws.max_row + 1):
for col in range(1, ws.max_column + 1):
print(ws.cell(row, col).value)
書式設定
フォント設定
python
from openpyxl.styles import Font
# フォントを設定
ws['A1'].font = Font(
name='メイリオ',
size=14,
bold=True,
italic=False,
color='FF0000' # 赤
)
塗りつぶし
python
from openpyxl.styles import PatternFill
# 背景色を設定
ws['A1'].fill = PatternFill(
patternType='solid',
fgColor='FFFF00' # 黄色
)
罫線
python
from openpyxl.styles import Border, Side
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
ws['A1'].border = thin_border
配置
python
from openpyxl.styles import Alignment
ws['A1'].alignment = Alignment(
horizontal='center',
vertical='center'
)
列幅・行高
python
# 列幅を設定
ws.column_dimensions['A'].width = 20
# 行高を設定
ws.row_dimensions[1].height = 30
実践例
例1: 複数ファイルの集計
python
import os
from openpyxl import load_workbook, Workbook
def aggregate_files(folder_path, output_path):
"""フォルダ内のExcelファイルを集計"""
result_wb = Workbook()
result_ws = result_wb.active
result_ws.append(['ファイル名', '合計'])
for filename in os.listdir(folder_path):
if filename.endswith('.xlsx'):
filepath = os.path.join(folder_path, filename)
wb = load_workbook(filepath)
ws = wb.active
# B列の合計を計算
total = sum(
cell.value for cell in ws['B']
if isinstance(cell.value, (int, float))
)
result_ws.append([filename, total])
result_wb.save(output_path)
print(f"集計完了: {output_path}")
# 実行
aggregate_files("data/", "集計結果.xlsx")
例2: テンプレートからの帳票生成
python
from openpyxl import load_workbook
from datetime import date
def generate_invoice(template_path, output_path, data):
"""テンプレートから請求書を生成"""
wb = load_workbook(template_path)
ws = wb.active
# データを埋め込み
ws['B3'] = data['company_name']
ws['B5'] = date.today()
ws['B7'] = data['invoice_no']
# 明細を入力
start_row = 10
for i, item in enumerate(data['items']):
row = start_row + i
ws.cell(row, 1, item['name'])
ws.cell(row, 2, item['quantity'])
ws.cell(row, 3, item['price'])
ws.cell(row, 4, f'=B{row}*C{row}')
wb.save(output_path)
print(f"請求書を生成: {output_path}")
# データ
invoice_data = {
'company_name': '株式会社サンプル',
'invoice_no': 'INV-2025-001',
'items': [
{'name': '商品A', 'quantity': 10, 'price': 1000},
{'name': '商品B', 'quantity': 5, 'price': 2000},
]
}
generate_invoice("template.xlsx", "請求書.xlsx", invoice_data)
例3: データの検索・抽出
python
from openpyxl import load_workbook, Workbook
def extract_data(input_path, output_path, condition_func):
"""条件に合うデータを抽出"""
wb_in = load_workbook(input_path)
ws_in = wb_in.active
wb_out = Workbook()
ws_out = wb_out.active
# ヘッダーをコピー
for col, cell in enumerate(ws_in[1], 1):
ws_out.cell(1, col, cell.value)
# 条件に合う行を抽出
out_row = 2
for row in ws_in.iter_rows(min_row=2):
row_values = [cell.value for cell in row]
if condition_func(row_values):
for col, cell in enumerate(row, 1):
ws_out.cell(out_row, col, cell.value)
out_row += 1
wb_out.save(output_path)
print(f"抽出完了: {out_row - 2}件")
# 使用例:C列が100以上のデータを抽出
extract_data(
"data.xlsx",
"抽出結果.xlsx",
lambda row: row[2] is not None and row[2] >= 100
)
pandas連携
Excelの読み込み
python
import pandas as pd
# Excelを読み込み
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")
# 特定の列のみ
df = pd.read_excel("data.xlsx", usecols=["名前", "売上"])
# ヘッダーなし
df = pd.read_excel("data.xlsx", header=None)
Excelへの書き込み
python
# DataFrameをExcelに出力
df.to_excel("output.xlsx", index=False)
# 複数シートに出力
with pd.ExcelWriter("output.xlsx") as writer:
df1.to_excel(writer, sheet_name="データ1")
df2.to_excel(writer, sheet_name="データ2")
openpyxlとの併用
python
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font
# pandasで処理
df = pd.read_excel("data.xlsx")
df_summary = df.groupby("カテゴリ").sum()
# Excelに出力
df_summary.to_excel("summary.xlsx")
# openpyxlで書式設定
wb = load_workbook("summary.xlsx")
ws = wb.active
ws['A1'].font = Font(bold=True)
wb.save("summary.xlsx")
まとめ
Python×Excelの基本
python
from openpyxl import Workbook, load_workbook
# 新規作成
wb = Workbook()
ws = wb.active
# 読み込み
wb = load_workbook("file.xlsx")
# セル操作
ws['A1'] = "値"
value = ws['A1'].value
# 保存
wb.save("output.xlsx")
使い分け
VBAが向いている
- Excel内で完結する処理
- 既存のマクロの改修
- 非エンジニアが保守
Pythonが向いている
- 大量データの処理
- 他システムとの連携
- 複雑なロジック
関連記事
