【初心者向け】PythonでExcelを動かす方法:詳細解説
はじめに
PythonとExcelの組み合わせで何ができる?
ビジネスや研究、プライベートなど、さまざまな場面で「Excel」は大活躍しています。データの整理、集計、分析、レポート作成など、手作業で行うことも多いですが、繰り返しの作業や大量のデータ処理は時間も手間もかかります。
ここでPythonの登場です。Pythonはプログラミング言語の中でも特に「読みやすく書きやすい」という特徴を持ち、データ処理や自動化を得意としています。PythonとExcelを組み合わせることで、次のようなことが可能になります。
- 手作業の自動化: 定型的なデータ入力、コピー&ペースト、書式設定などを自動化できます。
- 大量データの高速処理: 手作業では難しいような、何万行ものデータの集計や変換をあっという間に実行できます。
- 複数のExcelファイルの連携: 複数のシートやブックからデータを読み込み、集計して新しいファイルに書き出すといった処理も容易です。
- 他のデータソースとの連携: CSVファイル、データベース、Web上のデータなど、Excel以外のデータソースと組み合わせて処理できます。
- レポートの自動生成: 最新データを取得し、Excelテンプレートに流し込んで自動的にレポートを作成するといった応用も可能です。
これらの自動化は、作業時間の短縮だけでなく、手作業によるミスを減らすことにもつながります。
この記事の対象読者
- Pythonの基本的な文法(変数、リスト、ループ、関数など)はある程度理解している方。
- Excelは普段から使っているが、手作業でのデータ処理に限界を感じている方。
- プログラミングでExcelを自動化してみたいと考えている方。
この記事では、Pythonを使ってExcelファイルを操作するための基本的な知識から、具体的な操作方法、よくあるタスクの実現方法までを、初心者の方にも分かりやすく丁寧に解説します。
どのライブラリを使うか?
PythonでExcelを操作するためのライブラリはいくつか存在します。代表的なものとして、openpyxl
, pandas
, xlwings
などがあります。
openpyxl
:.xlsx
形式のファイルの読み書きに特化したライブラリです。書式設定なども細かく制御できます。Pythonだけで完結し、Excelがインストールされていない環境でも動作します。手軽に始めるのに最適です。pandas
: データ分析に非常に強力なライブラリです。Excelファイルの読み書き機能も持っていますが、主にデータフレーム(表形式のデータ構造)としてデータを扱います。大量データの読み込みや複雑なデータ処理に向いています。xlwings
: PythonからExcelアプリケーション自体を操作するためのライブラリです。Excelがインストールされている環境で動作し、VBAとの連携や、開いているブックへのアクセスなど、Excelの機能をより深く活用できます。
この記事では、Pythonだけで完結し、インストールも容易で、.xlsx
ファイルの基本的な読み書きと書式設定を幅広くカバーできるという理由から、主にopenpyxl
を中心に解説を進めます。pandas
やxlwings
についても、簡単な紹介にとどめます。
準備編:必要なものを揃えよう
Pythonを使ってExcelファイルを操作するには、Python本体と、対応するライブラリが必要です。
Pythonのインストール
Pythonがまだインストールされていない場合は、公式サイトからダウンロードしてインストールしてください。
Python公式ダウンロードページ
インストール方法の詳細については、ここでは割愛します。多くの入門サイトや書籍で詳しく解説されていますので、そちらを参考にしてください。インストール時には、「Add Python to PATH」のチェックボックスをオンにするのを忘れないようにしましょう。
ライブラリのインストール (openpyxl)
Pythonのライブラリは、pip
というツールを使って簡単にインストールできます。コマンドプロンプトやターミナルを開き、以下のコマンドを実行してください。
bash
pip install openpyxl
これにより、openpyxl
ライブラリがインターネット経由でダウンロードされ、あなたのPython環境にインストールされます。
pandas
やxlwings
も試してみたい場合は、同様に以下のコマンドでインストールできます。
bash
pip install pandas
pip install xlwings
これで、Pythonを使ってExcelファイルを操作するための準備は完了です!
openpyxl の基本を知ろう
openpyxl
を使ったExcel操作の基本となる概念と、最もよく使う操作を解説します。
openpyxlの基本概念:ワークブック、ワークシート、セル
Excelファイルは階層構造を持っています。
- ワークブック (Workbook): Excelファイルそのものです。複数のシートを含むことができます。
- ワークシート (Worksheet): ワークブックの中に複数存在できる「シート」のことです。「Sheet1」「Sheet2」といった名前がついています。
- セル (Cell): ワークシート内の個々のマス目のことです。列(A, B, C…)と行(1, 2, 3…)の組み合わせで指定します(例: A1セル、B2セル)。
openpyxl
では、これらの概念がPythonのオブジェクト(プログラム上で扱える「もの」)として表現されます。
- ワークブックは
Workbook
オブジェクト。 - ワークシートは
Worksheet
オブジェクト。 - セルは
Cell
オブジェクト。
これらのオブジェクトを操作することで、Excelファイルの読み書きを行います。
ワークブックの読み込み
既存のExcelファイルをPythonで開く(読み込む)には、openpyxl.load_workbook()
関数を使います。
まず、読み込みたいExcelファイルを用意します。例として、以下のような簡単なファイルを作成し、「sample.xlsx」という名前で保存してください。
A | B | C |
---|---|---|
氏名 | 年齢 | 職業 |
山田太郎 | 30 | エンジニア |
佐藤花子 | 25 | デザイナー |
“`python
import openpyxl
Excelファイルを読み込む
workbook = openpyxl.load_workbook(‘sample.xlsx’)
ワークブックが読み込まれたことを確認
print(“ワークブックを読み込みました。”)
“`
load_workbook()
関数の引数に、読み込みたいExcelファイルのパスを指定します。ファイルがPythonスクリプトと同じフォルダにある場合は、ファイル名だけでOKです。
ワークブックの新規作成
新しいExcelファイルを作成するには、openpyxl.Workbook()
クラスを使います。
“`python
import openpyxl
新しいワークブックを作成
new_workbook = openpyxl.Workbook()
新しいワークブックが作成されたことを確認
print(“新しいワークブックを作成しました。”)
作成したワークブックをファイルとして保存(後述)
new_workbook.save(‘new_file.xlsx’)
“`
新しいワークブックを作成した時点では、メモリ上に存在しているだけです。ファイルとして保存するには、後述するsave()
メソッドが必要です。
ワークシートの選択
ワークブックの中から特定のワークシートを選んで操作するには、いくつかの方法があります。
1. シート名を指定して選択
ワークブックオブジェクトから、シート名をキーにしてアクセスします。
“`python
import openpyxl
workbook = openpyxl.load_workbook(‘sample.xlsx’)
シート名を指定してワークシートを取得
sheet = workbook[‘Sheet1′] # デフォルトで作成されるシート名は通常’Sheet1’
print(f”選択中のシート名: {sheet.title}”)
“`
もし指定したシート名が存在しない場合は、エラーになります。
2. アクティブなシートを選択
Excelでファイルを開いたときに表示されているシートを「アクティブなシート」と呼びます。workbook.active
プロパティで取得できます。
“`python
import openpyxl
workbook = openpyxl.load_workbook(‘sample.xlsx’)
アクティブなシートを取得
active_sheet = workbook.active
print(f”アクティブなシート名: {active_sheet.title}”)
“`
新しいワークブックを作成した場合、最初に作られるシートがアクティブシートになります。
3. すべてのシートを取得する
ワークブック内のすべてのシートを取得するには、workbook.worksheets
を使います。これはリストのような形でシートオブジェクトを返します。
“`python
import openpyxl
workbook = openpyxl.load_workbook(‘sample.xlsx’)
すべてのシートを取得
all_sheets = workbook.worksheets
print(“ワークブック内のシート一覧:”)
for sheet in all_sheets:
print(f”- {sheet.title}”)
またはシート名のリストを取得
sheet_names = workbook.sheetnames
print(f”シート名のリスト: {sheet_names}”)
“`
ワークシートの作成と削除
ワークシートの作成
新しいワークシートを作成するには、workbook.create_sheet()
メソッドを使います。引数にシート名を指定できます。指定しない場合は「Sheet」の後に連番が振られます(例: Sheet2, Sheet3)。
“`python
import openpyxl
workbook = openpyxl.Workbook() # 新規ワークブックを作成
新しいシートを作成(デフォルト名)
new_sheet1 = workbook.create_sheet()
print(f”新規シート作成: {new_sheet1.title}”)
名前を指定して新しいシートを作成
new_sheet2 = workbook.create_sheet(“MyNewSheet”)
print(f”新規シート作成: {new_sheet2.title}”)
シートを作成する位置を指定することも可能(indexは0から始まる)
最初のシートとして挿入
first_sheet = workbook.create_sheet(“FirstSheet”, index=0)
print(f”新規シート作成 (先頭): {first_sheet.title}”)
現在のシート一覧を確認
print(f”現在のシート一覧: {workbook.sheetnames}”)
ワークブックを保存(忘れずに!)
workbook.save(‘workbook_with_new_sheets.xlsx’)
“`
ワークシートの削除
特定のシートを削除するには、workbook.remove()
メソッドを使います。引数に削除したいシートオブジェクトを指定します。
“`python
import openpyxl
workbook = openpyxl.Workbook()
sheet1 = workbook.create_sheet(“Sheet1”)
sheet2 = workbook.create_sheet(“Sheet2”)
sheet3 = workbook.create_sheet(“Sheet3”)
print(f”削除前シート一覧: {workbook.sheetnames}”)
シートオブジェクトを指定して削除
workbook.remove(sheet2)
print(f”削除後シート一覧: {workbook.sheetnames}”)
ワークブックを保存
workbook.save(‘workbook_after_removing_sheet.xlsx’)
“`
シート名だけを指定して削除する直接的なメソッドはありませんが、シート名からシートオブジェクトを取得して削除することは可能です。
“`python
シート名からシートオブジェクトを取得して削除
sheet_to_remove = workbook[‘Sheet1’]
workbook.remove(sheet_to_remove)
print(f”Sheet1削除後シート一覧: {workbook.sheetnames}”)
“`
セルの読み書き
ワークシートオブジェクトを取得できたら、次はその中のセルを操作します。
セルの値の取得
特定のセルの値を取得するには、セル座標(例: ‘A1’)を使ってアクセスするか、行番号と列番号を使ってアクセスします。
“`python
import openpyxl
workbook = openpyxl.load_workbook(‘sample.xlsx’)
sheet = workbook.active # アクティブなシートを選択
セル座標を指定して値を取得 (例: A1セルの値)
cell_a1_value = sheet[‘A1’].value
print(f”A1セルの値: {cell_a1_value}”)
行番号と列番号を指定して値を取得 (例: 2行目のB列、山田太郎さんの年齢)
行番号、列番号はともに1から始まる点に注意!
cell_b2_value = sheet.cell(row=2, column=2).value
print(f”B2セルの値: {cell_b2_value}”)
3行目のC列の値(佐藤花子さんの職業)
cell_c3_value = sheet.cell(row=3, column=3).value
print(f”C3セルの値: {cell_c3_value}”)
“`
.value
プロパティを使うことで、そのセルに入力されている実際の値を取得できます。数値、文字列、日付など、Excelで入力されているデータ型に応じて適切なPythonのデータ型として取得されます。
セルの値の書き込み
特定のセルに値を書き込むには、取得したセルオブジェクトの.value
プロパティに値を代入します。
“`python
import openpyxl
新しいワークブックを作成
workbook = openpyxl.Workbook()
sheet = workbook.active
セル座標を指定して値を書き込み
sheet[‘A1’] = ‘Hello’
sheet[‘B1’] = ‘World’
行番号と列番号を指定して値を書き込み
sheet.cell(row=2, column=1, value=’Python’)
sheet.cell(row=2, column=2, value=’Excel’)
数値や日付もそのまま代入可能
sheet[‘A3’] = 123
sheet[‘B3’] = 45.67
import datetime
sheet[‘C3’] = datetime.date(2023, 10, 26) # 日付オブジェクト
print(“セルに値を書き込みました。”)
ワークブックを保存(重要!)
workbook.save(‘written_data.xlsx’)
“`
値を書き込んだだけではファイルに反映されません。必ずworkbook.save()
メソッドでファイルを保存する必要があります。
openpyxl を使った具体的な操作
ここからは、実際のExcel操作でよく使う具体的な方法を解説します。
データの読み込み:応用編
範囲を指定して読み込む
特定の四角い範囲(例えばA1からC5まで)のデータをまとめて読み込むには、スライス記法を使ったり、iter_rows()
やiter_cols()
メソッドを使ったりします。
“`python
import openpyxl
workbook = openpyxl.load_workbook(‘sample.xlsx’)
sheet = workbook.active
例: A1からC3までの範囲を読み込む
結果はタプルのタプルとして取得される
range_data = sheet[‘A1′:’C3’]
print(“範囲読み込み (A1:C3):”)
for row_cells in range_data: # 各要素はタプル(各セルのオブジェクトが入っている)
for cell in row_cells: # 各要素はセルオブジェクト
print(cell.value, end=’\t’) # セルの値を表示
print() # 行の終わりに改行
または、iter_rows()メソッドを使う
min_row, max_row, min_col, max_colで範囲を指定
値だけを取得したい場合は values_only=True を指定できる
print(“\niter_rows()を使った範囲読み込み (A1:C3):”)
for row in sheet.iter_rows(min_row=1, max_row=3, min_col=1, max_col=3, values_only=True):
print(row)
iter_cols()を使えば列ごとにデータを取得できる
print(“\niter_cols()を使った範囲読み込み (A1:C3):”)
for col in sheet.iter_cols(min_row=1, max_row=3, min_col=1, max_col=3, values_only=True):
print(col)
“`
iter_rows()
やiter_cols()
は、特に大量のデータを扱う場合にメモリ効率が良い方法です。values_only=True
とすることで、セルオブジェクトではなくセルの値だけを直接取得できるため、さらにシンプルに扱えます。
シート全体のデータを読み込む
シート全体(データが入力されている範囲)を読み込むには、iter_rows()
やiter_cols()
を引数なしで使うか、sheet.rows
やsheet.columns
プロパティを使います。
“`python
import openpyxl
workbook = openpyxl.load_workbook(‘sample.xlsx’)
sheet = workbook.active
print(“シート全体をiter_rows()で読み込み:”)
for row in sheet.iter_rows(values_only=True):
print(row)
print(“\nシート全体をsheet.rowsで読み込み:”)
for row_cells in sheet.rows: # 各要素はタプル(各セルのオブジェクトが入っている)
row_values = [cell.value for cell in row_cells] # 各セルの値を取得
print(row_values)
“`
sheet.rows
やsheet.columns
は、シートの左上隅から右下隅まで、データが入っている範囲(sheet.min_row
からsheet.max_row
、sheet.min_column
からsheet.max_column
)を自動的に判断してくれます。
ヘッダー行をスキップしてデータを読み込む
Excelファイルの最初の行(ヘッダー行)はデータの見出しであることが多いです。データ本体だけを処理したい場合は、ヘッダー行を読み飛ばす必要があります。
iter_rows()
を使う場合、min_row
を2以上に指定すれば、最初の行をスキップできます。
“`python
import openpyxl
workbook = openpyxl.load_workbook(‘sample.xlsx’)
sheet = workbook.active
ヘッダー行をスキップしてデータ行を読み込む (min_row=2を指定)
print(“ヘッダー行をスキップして読み込み:”)
for row in sheet.iter_rows(min_row=2, values_only=True):
print(row)
sheet.rowsを使う場合は、最初の要素をスキップする
print(“\nsheet.rowsで最初の行をスキップして読み込み:”)
for index, row_cells in enumerate(sheet.rows):
if index == 0: # 0番目のインデックス(最初の行)はスキップ
continue
row_values = [cell.value for cell in row_cells]
print(row_values)
“`
データの書き込み:応用編
複数のセルにまとめて書き込む(ループ処理)
リストや他のデータ構造に入っているデータを、まとめてExcelシートに書き込むのはよくあるタスクです。ループ処理を使います。
“`python
import openpyxl
workbook = openpyxl.Workbook()
sheet = workbook.active
書き込みたいデータ(リストのリスト)
data = [
[‘商品名’, ‘価格’, ‘数量’],
[‘りんご’, 100, 5],
[‘バナナ’, 80, 10],
[‘オレンジ’, 150, 3],
]
iter_rows()で書き込む場合(推奨)
append()メソッドを使って行を追加していくのが最も簡単
for row_data in data:
sheet.append(row_data) # リストを行として追加
print(“データをシートに書き込みました (append)。”)
または、セルを一つずつ指定して書き込む
for row_index, row_data in enumerate(data, start=1): # 行番号は1から始める
for col_index, cell_value in enumerate(row_data, start=1): # 列番号も1から始める
sheet.cell(row=row_index, column=col_index, value=cell_value)
ワークブックを保存
workbook.save(‘written_multiple_data.xlsx’)
“`
sheet.append(row_data)
は非常に便利です。引数にリストやタプルを指定すると、シートの末尾に新しい行として追加されます。リストの各要素がその行の各セルに順番に書き込まれます。
数式の書き込み
Excelの数式もセルに書き込むことができます。値の書き込みと同様に、数式を表す文字列をセルに代入します。
“`python
import openpyxl
workbook = openpyxl.Workbook()
sheet = workbook.active
データ入力
sheet[‘A1’] = 100
sheet[‘A2’] = 200
sheet[‘A3’] = 300
A4セルにA1からA3までの合計値を計算する数式を書き込む
sheet[‘A4’] = ‘=SUM(A1:A3)’
B1セルにA1セルの値を参照する数式を書き込む
sheet[‘B1’] = ‘=A1’
C1セルに文字列を連結する数式を書き込む
sheet[‘C1’] = ‘=”合計は “&A4’ # 文字列はダブルクォーテーションで囲み、エスケープする
print(“数式をセルに書き込みました。”)
ワークブックを保存
workbook.save(‘written_formulas.xlsx’)
“`
保存したExcelファイルを開くと、数式が評価され、計算結果が表示されます。
シートの操作:応用編
シート名の変更
シート名を変更するには、ワークシートオブジェクトの.title
プロパティに新しいシート名を代入します。
“`python
import openpyxl
workbook = openpyxl.Workbook()
sheet = workbook.active # デフォルトのシート (通常’Sheet’)
print(f”変更前シート名: {sheet.title}”)
シート名を変更
sheet.title = “RenamedSheet”
print(f”変更後シート名: {sheet.title}”)
print(f”現在のシート一覧: {workbook.sheetnames}”)
ワークブックを保存
workbook.save(‘renamed_sheet.xlsx’)
“`
シートのコピー
既存のシートをコピーするには、workbook.copy_sheet()
メソッドを使います。
“`python
import openpyxl
workbook = openpyxl.Workbook()
sheet1 = workbook.active
sheet1.title = “OriginalSheet”
sheet1[‘A1’] = ‘これは元のシートです’
シートをコピー
copy_sheet()メソッドは、コピーしたシートのオブジェクトを返します
copied_sheet = workbook.copy_sheet(sheet1)
コピーされたシートの名前は通常 ‘OriginalSheet Copy’ となります
print(f”コピーされたシート名: {copied_sheet.title}”)
print(f”現在のシート一覧: {workbook.sheetnames}”)
コピーしたシートの内容を確認 (元のシートと同じ)
print(f”コピーされたシートのA1の値: {copied_sheet[‘A1’].value}”)
コピーしたシートの内容を変更しても元には影響しない
copied_sheet[‘A1’] = ‘これはコピーされたシートです’
print(f”変更後コピーされたシートのA1の値: {copied_sheet[‘A1’].value}”)
print(f”変更後元のシートのA1の値: {sheet1[‘A1’].value}”) # 元のシートは変わらない
ワークブックを保存
workbook.save(‘copied_sheet.xlsx’)
“`
シートの移動
ワークブック内でのシートの並び順を変更するには、workbook._sheets
という内部リストを操作します。これは少しテクニカルな方法ですが、公式ドキュメントでも紹介されています。
“`python
import openpyxl
workbook = openpyxl.Workbook()
sheet1 = workbook.create_sheet(“SheetA”)
sheet2 = workbook.create_sheet(“SheetB”)
sheet3 = workbook.create_sheet(“SheetC”)
print(f”変更前シート一覧: {workbook.sheetnames}”) # [‘Sheet’, ‘SheetA’, ‘SheetB’, ‘SheetC’] となる可能性あり
デフォルトで作成される’Sheet’が先頭にある場合があるため、それも考慮する
default_sheet = workbook.get_sheet_by_name(‘Sheet’) if ‘Sheet’ in workbook.sheetnames else None
シートオブジェクトのリストを取得
all_sheets = [ws for ws in workbook.worksheets]
リストを操作して並び順を変更
例: ‘SheetC’, ‘SheetA’, ‘SheetB’ の順にしたい
if default_sheet: # デフォルトシートがあれば除いてから並べ替え
sheets_to_order = [s for s in all_sheets if s != default_sheet]
# 新しい順番のリストを作成
new_order = [sheet3, sheet1, sheet2]
# リストを結合してワークブックの内部リストを更新
workbook._sheets = [default_sheet] + new_order
else: # デフォルトシートがなければそのまま並べ替え
new_order = [sheet3, sheet1, sheet2]
workbook._sheets = new_order
print(f”変更後シート一覧: {workbook.sheetnames}”) # 例: [‘Sheet’, ‘SheetC’, ‘SheetA’, ‘SheetB’] もしくは [‘SheetC’, ‘SheetA’, ‘SheetB’]
ワークブックを保存
workbook.save(‘reordered_sheets.xlsx’)
“`
シートの非表示/再表示
シートを非表示にしたり、再表示したりすることも可能です。ワークシートオブジェクトの.sheet_state
プロパティを設定します。
'visible'
(デフォルト): 表示'hidden'
: 非表示'veryHidden'
: VBAからのみ再表示可能(非常に隠されている)
“`python
import openpyxl
workbook = openpyxl.Workbook()
sheet1 = workbook.active
sheet1.title = “VisibleSheet”
sheet2 = workbook.create_sheet(“HiddenSheet”)
sheet2を非表示にする
sheet2.sheet_state = ‘hidden’
print(f”{sheet2.title} の状態: {sheet2.sheet_state}”)
ワークブックを保存してExcelで開くと、HiddenSheetは表示されない
workbook.save(‘hidden_sheet.xlsx’)
非表示にしたシートを再表示する
一度読み込み直すか、同じワークブックオブジェクトを使い続ける
workbook_reloaded = openpyxl.load_workbook(‘hidden_sheet.xlsx’)
sheet_to_show = workbook_reloaded[‘HiddenSheet’] # 非表示でもシートオブジェクトは取得できる
sheet_to_show.sheet_state = ‘visible’
print(f”{sheet_to_show.title} の状態: {sheet_to_show.sheet_state}”)
再表示した状態で保存
workbook_reloaded.save(‘shown_sheet.xlsx’)
“`
セルの書式設定
openpyxl
を使えば、セルのフォント、背景色、罫線などの書式設定も細かく制御できます。書式設定はopenpyxl.styles
モジュールを使います。
フォント設定
openpyxl.styles.Font
クラスを使ってフォントスタイルを定義し、セルオブジェクトの.font
プロパティに設定します。
“`python
import openpyxl
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
workbook = openpyxl.Workbook()
sheet = workbook.active
cell = sheet[‘A1’]
cell.value = “Hello, World!”
フォント設定の作成
太字、斜体、下線、文字色(RGB値)、サイズなどを指定可能
bold_red_font = Font(
name=’Arial’, # フォント名
size=14, # サイズ
bold=True, # 太字
italic=False, # 斜体
underline=’none’, # 下線 (‘single’, ‘double’, ‘singleAccounting’, ‘doubleAccounting’, ‘none’)
strike=False, # 取り消し線
color=’FFFF0000′ # 色 (RRGGBB形式の16進数)
)
セルにフォント設定を適用
cell.font = bold_red_font
print(“A1セルにフォント設定を適用しました。”)
ワークブックを保存
workbook.save(‘font_example.xlsx’)
“`
背景色(塗りつぶし)設定
openpyxl.styles.PatternFill
クラスを使って塗りつぶしスタイルを定義し、セルオブジェクトの.fill
プロパティに設定します。
“`python
… Font設定コードに続けて
cell_b1 = sheet[‘B1’]
cell_b1.value = “背景色テスト”
塗りつぶし設定の作成
PatternFill(fill_type=’solid’, fgColor=’FF00FF00′) # 単色塗りつぶし (前景色の指定)
PatternFill(fill_type=’lightGray1′, bgColor=’FF00FF00′) # パターン塗りつぶし (背景色の指定)
yellow_fill = PatternFill(
fill_type=’solid’,
fgColor=’FFFFFF00′ # 黄色 (RRGGBB)
)
セルに塗りつぶし設定を適用
cell_b1.fill = yellow_fill
print(“B1セルに背景色設定を適用しました。”)
ワークブックを保存
workbook.save(‘fill_example.xlsx’)
“`
配置(水平、垂直、折り返し)設定
openpyxl.styles.Alignment
クラスを使って配置スタイルを定義し、セルオブジェクトの.alignment
プロパティに設定します。
“`python
… 前のコードに続けて
cell_c1 = sheet[‘C1’]
cell_c1.value = “これは長いテキストです。折り返して表示します。”
配置設定の作成
alignment_style = Alignment(
horizontal=’center’, # 水平位置 (‘general’, ‘left’, ‘center’, ‘right’, ‘fill’, ‘justify’, ‘centerContinuous’, ‘distributed’)
vertical=’center’, # 垂直位置 (‘top’, ‘center’, ‘bottom’, ‘justify’, ‘distributed’)
wrapText=True # テキスト折り返し
)
セルに配置設定を適用
cell_c1.alignment = alignment_style
print(“C1セルに配置設定を適用しました。”)
ワークブックを保存
workbook.save(‘alignment_example.xlsx’)
“`
罫線設定
openpyxl.styles.Border
クラスとopenpyxl.styles.Side
クラスを使って罫線スタイルを定義し、セルオブジェクトの.border
プロパティに設定します。Side
で線の種類や色を指定し、Border
で上下左右斜めのどの辺にどの線を引くかを指定します。
“`python
… 前のコードに続けて
cell_d1 = sheet[‘D1’]
cell_d1.value = “罫線テスト”
線のスタイル定義
thin_black = Side(border_style=’thin’, color=’FF000000′) # 細線、黒
medium_blue = Side(border_style=’medium’, color=’FF0000FF’) # 中線、青
罫線設定の作成
top, bottom, left, right, diagonal, diagonalUp, diagonalDownを指定
border_style = Border(
top=thin_black,
bottom=medium_blue,
left=thin_black,
right=thin_black
)
セルに罫線設定を適用
cell_d1.border = border_style
print(“D1セルに罫線設定を適用しました。”)
ワークブックを保存
workbook.save(‘border_example.xlsx’)
“`
セルの結合と解除
複数のセルを結合したり、結合を解除したりするには、merge_cells()
メソッドとunmerge_cells()
メソッドを使います。
“`python
… 前のコードに続けて
sheet.merge_cells(‘E1:F2’) # E1からF2までを結合
merged_cell = sheet[‘E1′] # 結合されたセルは左上のセルオブジェクトで代表される
merged_cell.value = “結合されたセル”
merged_cell.alignment = Alignment(horizontal=’center’, vertical=’center’) # 中央揃えにして見やすく
print(“E1:F2を結合しました。”)
ワークブックを保存
workbook.save(‘merged_cells.xlsx’)
結合を解除する場合
workbook_reloaded = openpyxl.load_workbook(‘merged_cells.xlsx’)
sheet_reloaded = workbook_reloaded.active
sheet_reloaded.unmerge_cells(‘E1:F2’)
print(“E1:F2の結合を解除しました。”)
workbook_reloaded.save(‘unmerged_cells.xlsx’)
“`
列幅、行高の調整
列の幅や行の高さを調整するには、ワークシートオブジェクトのcolumn_dimensions
やrow_dimensions
を使います。
“`python
… 前のコードに続けて
列幅の調整
sheet.column_dimensions[‘A’].width = 30 # A列の幅を30に設定
行高の調整
sheet.row_dimensions[1].height = 40 # 1行目の高さを40に設定
print(“列幅と行高を調整しました。”)
ワークブックを保存
workbook.save(‘dimensions_example.xlsx’)
“`
列は文字(’A’, ‘B’, …)で、行は数字(1, 2, …)で指定します。
数値形式(表示形式)設定
セルの表示形式(小数点以下の桁数、通貨、日付など)を設定するには、セルオブジェクトの.number_format
プロパティに形式を表す文字列を指定します。
“`python
… 前のコードに続けて
import datetime
sheet[‘A5’] = 12345.6789
sheet[‘B5’] = datetime.datetime.now()
sheet[‘C5’] = 0.25
数値形式を設定
sheet[‘A5’].number_format = ‘#,##0.00’ # カンマ区切り、小数点以下2桁
sheet[‘B5’].number_format = ‘yyyy/mm/dd hh:mm:ss’ # 年/月/日 時:分:秒
sheet[‘C5’].number_format = ‘0%’ # パーセント表示
print(“セルに数値形式を設定しました。”)
ワークブックを保存
workbook.save(‘number_format_example.xlsx’)
“`
指定できる形式文字列はExcelの表示形式とほぼ同じです。一般的なものは以下の通りです。
'General'
(標準)'0'
(小数点以下を表示しない数値)'0.00'
(小数点以下2桁を表示する数値)'#,##0'
(カンマ区切りの整数)'#,##0.00'
(カンマ区切り、小数点以下2桁)'0%'
(パーセント、小数点以下を表示しない)'0.00%'
(パーセント、小数点以下2桁)'yyyy/mm/dd'
(日付)'yyyy-mm-dd hh:mm:ss'
(日時)'¥#,##0'
(通貨 – 日本円)'"$ "#,##0'
(通貨 – 米ドル)
ワークブックの保存
作成または変更したワークブックをファイルとして保存するには、workbook.save()
メソッドを使います。
“`python
import openpyxl
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet[‘A1’] = ‘保存テスト’
ワークブックをファイルとして保存
ファイル名に ‘.xlsx’ をつけるのが一般的
workbook.save(‘my_saved_workbook.xlsx’)
print(“ワークブックを ‘my_saved_workbook.xlsx’ として保存しました。”)
別のファイル名で保存
workbook.save(‘another_name.xlsx’)
print(“ワークブックを ‘another_name.xlsx’ として保存しました。”)
既存ファイルを上書き保存
workbook = openpyxl.load_workbook(‘my_saved_workbook.xlsx’)
sheet = workbook.active
sheet[‘A2’] = ‘上書きしました’
workbook.save(‘my_saved_workbook.xlsx’) # 同じファイル名を指定すると上書きされる
print(“‘my_saved_workbook.xlsx’ を上書き保存しました。”)
“`
既に開いているExcelファイルを指定して保存しようとすると、エラーになる場合があります。PythonスクリプトからExcelファイルを操作する際は、対象のExcelファイルは閉じておくのが安全です。
よくあるタスクとサンプルコード
これまでに学んだことを組み合わせて、実際の業務で発生しがちなタスクを自動化する例を見てみましょう。
例1:CSVファイルを読み込み、Excelに変換して保存
CSVファイルはExcelで開けますが、書式設定ができなかったり、複数のシートを扱えなかったりします。Pythonを使ってCSVを読み込み、整形してからExcelファイルとして保存する例です。
事前に、以下のような内容で「data.csv」というファイルを作成しておいてください。
csv
Name,Age,City
Alice,30,Tokyo
Bob,25,Osaka
Charlie,35,Nagoya
“`python
import openpyxl
import csv
CSVファイル名と出力Excelファイル名
csv_file_name = ‘data.csv’
excel_file_name = ‘data_from_csv.xlsx’
新しいワークブックを作成
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = “データシート” # シート名を設定
CSVファイルを読み込み、Excelシートに書き込む
try:
with open(csv_file_name, ‘r’, encoding=’utf-8′) as csvfile:
# csv.readerを使ってCSVを行ごとに読み込む
csv_reader = csv.reader(csvfile)
# CSVの各行をExcelシートにappendで追加
for row_data in csv_reader:
sheet.append(row_data)
# ヘッダー行に書式設定(太字、背景色)を適用する
from openpyxl.styles import Font, PatternFill
header_font = Font(bold=True)
header_fill = PatternFill(fill_type='solid', fgColor='FFC0C0C0') # 薄い灰色
# 1行目の各セルにスタイルを適用
for cell in sheet[1]: # sheet[1]は1行目のすべてのセルを返します
cell.font = header_font
cell.fill = header_fill
# 列幅を自動調整に近い形で行う(あくまで簡易的なもの)
# 文字数に応じて幅を調整する関数があればより良いが、ここでは固定値で
# openpyxlには自動調整機能が組み込まれていないため、手動で行う必要がある
column_widths = {1: 15, 2: 10, 3: 20} # 列番号と幅の辞書
for col_index, width in column_widths.items():
sheet.column_dimensions[openpyxl.utils.get_column_letter(col_index)].width = width
# Excelファイルを保存
workbook.save(excel_file_name)
print(f"CSVファイル '{csv_file_name}' を読み込み、Excelファイル '{excel_file_name}' として保存しました。")
except FileNotFoundError:
print(f”エラー: ファイル ‘{csv_file_name}’ が見つかりません。”)
except Exception as e:
print(f”処理中にエラーが発生しました: {e}”)
“`
この例では、Python標準のcsv
モジュールを使ってCSVを読み込み、openpyxl
で新しいワークブックを作成し、読み込んだデータをappend()
で追加しています。さらに、ヘッダー行に簡単な書式設定も加えてみました。列幅の自動調整はopenpyxl
の苦手な部分ですが、手動で設定する方法を示しています。
例2:Excelファイルからデータを読み込み、計算して別のシートに書き出す
元のExcelファイルから特定のデータを読み込み、Pythonで計算や加工を行った後、その結果を同じワークブック内の別のシートに書き出す例です。
事前に、以下のような内容で「sales_data.xlsx」というファイルを作成しておいてください。
A | B | C | D |
---|---|---|---|
商品名 | 単価 | 数量 | 売上金額 |
りんご | 100 | 5 | |
バナナ | 80 | 10 | |
オレンジ | 150 | 3 | |
合計 |
D列と「合計」行は空のまま保存します。
“`python
import openpyxl
読み込むExcelファイル名
excel_file_name = ‘sales_data.xlsx’
output_sheet_name = ‘集計結果’
try:
# 既存のワークブックを読み込む
workbook = openpyxl.load_workbook(excel_file_name)
# 元のシート(データがあるシート)を選択
data_sheet = workbook.active
# 計算結果を書き込む新しいシートを作成(もしなければ)
if output_sheet_name not in workbook.sheetnames:
summary_sheet = workbook.create_sheet(output_sheet_name)
print(f"新しいシート '{output_sheet_name}' を作成しました。")
else:
summary_sheet = workbook[output_sheet_name]
# 既存のシートをクリアする場合(今回はそのまま使う)
# workbook.remove(summary_sheet)
# summary_sheet = workbook.create_sheet(output_sheet_name)
# print(f"既存のシート '{output_sheet_name}' を使用します。")
# ヘッダー行を除いてデータを読み込み、計算を行う
total_sales = 0
print("データを読み込み、計算中...")
# 2行目から最後のデータ行までを読み込む (iter_rowsを使う)
# values_only=Trueで値のみ取得
# max_rowはデータが入っている最終行を自動判定
for row_index, row_data in enumerate(data_sheet.iter_rows(min_row=2, values_only=True), start=2):
# row_dataはタプル: (商品名, 単価, 数量, 売上金額(空))
item_name, unit_price, quantity, _ = row_data # _ は使わない値のプレースホルダ
# 単価と数量が数値であることを確認(エラーチェックは簡略化)
try:
unit_price = float(unit_price) if unit_price is not None else 0
quantity = int(quantity) if quantity is not None else 0
except (ValueError, TypeError):
print(f"警告: {row_index}行目の単価または数量が不正な値です。スキップします。")
continue # この行の処理をスキップ
# 売上金額を計算
sales_amount = unit_price * quantity
# 元のシートのD列に売上金額を書き込む(計算結果を元のファイルに反映)
# iter_rowsで読み込んだ場合はセルオブジェクトではないので、再度セルを指定して書き込む
data_sheet.cell(row=row_index, column=4, value=sales_amount)
# 合計売上金額に加算
total_sales += sales_amount
# 元のシートの「合計」行(最終行)のD列に合計金額を書き込む
# 最終行は data_sheet.max_row で取得できる
data_sheet.cell(row=data_sheet.max_row, column=4, value=total_sales)
# 集計結果シートに結果を書き込む
# 簡単なサマリーを書き出す例
summary_sheet['A1'] = '全体の合計売上金額:'
summary_sheet['B1'] = total_sales # 計算した合計値を書き込む
# 書式設定(例: 合計金額を太字にする)
from openpyxl.styles import Font
summary_sheet['B1'].font = Font(bold=True)
summary_sheet['B1'].number_format = '#,##0' # カンマ区切りの整数表示
print("計算と書き込みが完了しました。")
# ワークブックを保存(元のファイルに上書き保存)
workbook.save(excel_file_name)
print(f"集計結果をExcelファイル '{excel_file_name}' に保存しました。")
except FileNotFoundError:
print(f”エラー: ファイル ‘{excel_file_name}’ が見つかりません。”)
except Exception as e:
print(f”処理中にエラーが発生しました: {e}”)
“`
この例では、既存のファイルを読み込み、データ行をループ処理で取得して計算を行い、計算結果を元のシートのD列に書き戻しつつ、合計値を別の集計シートにも書き出しています。iter_rows
とcell()
メソッドを組み合わせて使っている点がポイントです。エラーが発生した場合にメッセージを表示するようにtry...except
ブロックも追加しています。
例3:複数のExcelファイルから特定のデータを集計する(pandasを少し紹介)
複数のExcelファイル(例えば、店舗ごとの売上データファイル)からデータを読み込み、それらを一つにまとめて集計するタスクはよくあります。このようなタスクには、データ処理に特化したpandas
ライブラリが非常に強力です。
ここではopenpyxl
の範囲を超えますが、このような場面でpandas
がどう役立つかを簡単に紹介します。
例えば、「store_A_sales.xlsx」と「store_B_sales.xlsx」というファイルがあり、それぞれに「売上」シートがあるとします。各シートは例2の「sales_data.xlsx」のような形式とします。
“`python
import pandas as pd
import os # ファイルの一覧を取得するために使用
処理対象のファイルが格納されているフォルダを指定(例: スクリプトと同じフォルダ)
folder_path = ‘.’
集計対象のExcelファイルをリストアップ
ファイル名の末尾が ‘.xlsx’ で、かつ特定のパターンに合うものを取得
excel_files = [f for f in os.listdir(folder_path) if f.endswith(‘.xlsx’) and ‘store_’ in f and ‘_sales’ in f]
print(f”以下のファイルを処理します: {excel_files}”)
全ファイルのデータを格納するための空のデータフレームを作成
all_data = pd.DataFrame()
各ファイルを読み込み、データを結合する
for file_name in excel_files:
file_path = os.path.join(folder_path, file_name)
try:
# pandasのread_excelでExcelファイルを読み込む
# ‘売上’シートを読み込み、ヘッダー行は最初の行を使用
df = pd.read_excel(file_path, sheet_name=’売上’, header=0)
# ファイル名から店舗名を抽出して新しい列に追加 (例: store_A_sales.xlsx -> store_A)
store_name = file_name.replace('_sales.xlsx', '')
df['店舗名'] = store_name
# 必要ならデータの前処理(例: 売上金額の列を数値型に変換)
# df['売上金額'] = pd.to_numeric(df['売上金額'], errors='coerce') # 変換できない場合はNaNにする
# 全データフレームに結合
all_data = pd.concat([all_data, df], ignore_index=True)
print(f"ファイル '{file_name}' を読み込みました。")
except FileNotFoundError:
print(f"警告: ファイル '{file_path}' が見つかりません。")
except Exception as e:
print(f"ファイル '{file_path}' の読み込み中にエラーが発生しました: {e}")
全データの集計
if not all_data.empty:
print(“\n=== 全データ ===”)
print(all_data)
# 例: 商品名ごとの合計売上金額を集計
# 元のファイルに売上金額が計算されていない場合、ここで計算してから集計
if '売上金額' not in all_data.columns or all_data['売上金額'].isnull().all():
print("\n売上金額を計算します。")
# 単価と数量を使って売上金額を計算(エラー処理は別途必要)
all_data['売上金額'] = all_data['単価'] * all_data['数量']
# 商品名でグループ化して売上金額を合計
sales_summary = all_data.groupby('商品名')['売上金額'].sum().reset_index()
print("\n=== 商品別合計売上金額 ===")
print(sales_summary)
# 集計結果を新しいExcelファイルとして保存
output_excel_file = 'total_sales_summary.xlsx'
try:
# pandasのto_excelでデータフレームをExcelファイルに書き出す
sales_summary.to_excel(output_excel_file, index=False) # index=Falseで左端のインデックス列を書き出さない
print(f"\n集計結果を '{output_excel_file}' として保存しました。")
except Exception as e:
print(f"集計結果の保存中にエラーが発生しました: {e}")
else:
print(“処理対象のファイルが見つからなかったか、データがありませんでした。”)
“`
この例はopenpyxl
の解説からは少し外れますが、複数のファイルを扱うようなデータ処理においてはpandas
が非常に効率的であることを示すために含めました。pandas.read_excel
で簡単にExcelファイルをデータフレームとして読み込み、データフレームの機能(結合、グループ化、集計など)を使って処理し、pandas.to_excel
で結果をExcelファイルとして保存できます。これは、データ処理のワークフローにおいてopenpyxl
とpandas
を使い分ける、あるいは組み合わせて使う良い例です。
その他のライブラリ(簡単な紹介)
前述したように、PythonでExcelを扱うライブラリはopenpyxl
だけではありません。状況に応じて他のライブラリを検討することも有効です。
pandas
既に例3で触れましたが、pandas
はデータ分析・処理の強力なツールです。Excelファイルだけでなく、CSVや他の形式のデータも同じようにデータフレームとして扱えます。
- 得意なこと: 大量のデータ読み込み、データ結合、集計、フィルタリング、並べ替え、欠損値処理など、データそのものの加工・分析。
- 苦手なこと: セル単位での詳細な書式設定、グラフや図形の操作、ExcelのVBAマクロの実行など、Excelのアプリケーションとしての機能を細かく制御すること。
データの中身を処理することが目的であれば、openpyxl
でセルを一つずつ操作するよりもpandas
を使った方が効率的でコードも簡潔になることが多いです。
xlwings
xlwings
は、PythonからExcelアプリケーション自体を制御することに特化したライブラリです。Windows版とMac版のExcelに対応しています。
- 得意なこと: 開いているExcelブックへのアクセス、VBAマクロの実行、ExcelのCOM/AppleScriptインターフェースを介した詳細な操作、PythonとVBA間のデータやコードのやり取り。
- 苦手なこと: Excelがインストールされていない環境では動作しません。Pythonだけで完結させたい場合は不向きです。
もし「Pythonから既存のVBAマクロを実行したい」「現在開いているExcelファイルにデータを書き込みたい」「Excelの特定のボタンをクリックするような操作をしたい」といった要望がある場合は、xlwings
が有力な選択肢になります。
openpyxlとの使い分け
openpyxl
:.xlsx
ファイルの読み書き、基本的な書式設定、新しいファイルの作成など、Pythonだけで完結してExcelファイルを操作したい場合。特に、テンプレートファイルへのデータ流し込みや、簡単なデータ集計・変換などに向いています。pandas
: Excelファイル内のデータ自体を読み込んで、複雑な集計や加工を行いたい場合。大量データ処理にも向いています。入出力にExcelを使いたいが、主な処理はPythonで行う、という場合に強力です。xlwings
: Excelアプリケーションの機能をPythonから使いたい場合。既存のVBA資産を活用したい、Excelを起動して操作するような処理をしたい場合に適しています。
初心者がExcel操作の自動化を始める上では、まずopenpyxl
の基本的な使い方をマスターするのがおすすめです。ほとんどの定型作業はopenpyxl
で実現可能です。データ分析に進む場合はpandas
を、より高度なExcel連携が必要ならxlwings
を学習すると良いでしょう。
エラーハンドリングとデバッグ
プログラムを書いていると、エラーはつきものです。特にファイル操作では、ファイルが見つからなかったり、予期しない形式だったりすることがあります。エラーが発生したときにプログラムが突然終了するのではなく、適切に対処するための基本的な方法を知っておきましょう。
try…except ブロック
Pythonでは、エラーが発生しそうな処理をtry
ブロックの中に書き、エラーが発生した場合の処理をexcept
ブロックに書くことができます。
“`python
import openpyxl
file_name = ‘non_existent_file.xlsx’
try:
# 存在しないファイルを読み込もうとする(エラーが発生する可能性がある処理)
workbook = openpyxl.load_workbook(file_name)
print(f”ファイル ‘{file_name}’ を正常に読み込みました。”)
except FileNotFoundError:
# FileNotFoundErrorが発生した場合の処理
print(f”エラー: ファイル ‘{file_name}’ が見つかりません。ファイル名を確認してください。”)
except Exception as e:
# その他のエラーが発生した場合の処理
print(f”予期しないエラーが発生しました: {e}”)
print(“プログラムは終了しました。”)
“`
このコードを実行すると、non_existent_file.xlsx
が存在しないためFileNotFoundError
が発生し、except FileNotFoundError:
ブロック内のメッセージが表示されます。try...except
を使うことで、エラーが発生してもプログラムがクラッシュせず、メッセージを表示して終了することができます。
特定の種類のエラー(例: FileNotFoundError
)だけでなく、より一般的なException
をキャッチすることもできます。エラーオブジェクトをas e
で取得すると、エラーの詳細情報を確認できます。
Excelファイル操作で起こりうるエラーの例:
FileNotFoundError
: 指定したファイルが見つからない。KeyError
: 指定したシート名や辞書のキーが存在しない(シート名間違いなど)。TypeError
,ValueError
: セルに不適切な型の値を代入しようとした、数値に変換できない文字列を扱ったなど。IndexError
: 存在しない行や列にアクセスしようとした。
デバッグのヒント
プログラムが期待通りに動かないときは、デバッグが必要です。
- エラーメッセージを読む: Pythonがエラーを検出すると、 traceback と呼ばれるエラーが発生した場所やエラーの種類を示す情報が表示されます。これを丁寧に読むことが問題解決の第一歩です。特に最後の行に表示されるエラーの種類とメッセージ、そしてその上の行に表示されるファイル名と行番号が重要です。
- print()デバッグ: 変数の値や処理の途中の状態を確認したい場所に
print()
関数を挿入して、プログラムの実行を追跡します。例えば、ループの中で各セルの値が正しく読み込めているかを確認するなど。 - コメントアウト: 疑わしいコードのブロックを一時的にコメントアウトして実行し、問題の箇所を絞り込みます。
- 小さなステップで確認: 一度に多くの機能を追加せず、一つずつ動くことを確認しながら進めます。
実践的なヒントと注意点
PythonでのExcel操作をより効率的かつ安全に行うためのヒントです。
大規模データの扱い
openpyxl
は比較的メモリを使用するため、数万行を超えるような巨大なファイルを扱う場合は、以下の点に注意するか、pandas
のようなライブラリを検討した方が良い場合があります。
- 読み込み時:
openpyxl.load_workbook(file_name, read_only=True)
のようにread_only=True
オプションを付けると、読み込み専用モードになり、メモリ使用量を削減できます。このモードではセルの書式設定などは読み込まれませんが、値の読み込みは高速になります。 - 書き込み時: 新しいワークブックを作成する際に
openpyxl.Workbook(write_only=True)
のようにwrite_only=True
オプションを付けると、書き込み専用モードになります。このモードで作成したシートは、一度書き込んだセルには再度アクセスできませんが、大量のデータを高速に書き込むのに適しています。append()
メソッドはこのモードで効率的に動作します。
メモリ使用量
ExcelファイルをPythonで操作する際、ファイルの内容がメモリに読み込まれます。大きなファイルを扱う場合は、PCのメモリ容量を超えないように注意が必要です。read_only
やwrite_only
オプションを活用したり、ファイルを分割して処理したり、pandas
のようなライブラリの機能を活用したりすることで、メモリ使用量を抑えることができます。
開いているExcelファイルへのアクセス
openpyxl
は、Excelアプリケーションを介さずにファイル自体を直接読み書きします。そのため、開いているExcelファイルをopenpyxl
で読み書きしようとすると、エラーになったり、予期しない動作をしたりする可能性が高いです。openpyxl
で操作する際は、対象のExcelファイルは閉じておくのが安全です。
もし開いているファイルへのアクセスや、Excelアプリケーションのより深い機能(VBA連携など)が必要な場合は、xlwings
ライブラリの利用を検討してください。
VBAマクロを含むファイルの扱い
openpyxl
は.xlsx
ファイルに含まれるVBAマクロを削除せずに保持することができますが、Pythonスクリプトからマクロを実行することはできません。マクロの実行が必要な場合は、xlwings
を使うか、Pythonから外部コマンドとしてExcelアプリケーションを起動し、マクロを実行させる方法などを検討する必要があります。
まとめ
この記事では、Pythonを使ってExcelファイルを操作するための最も一般的で手軽なライブラリであるopenpyxl
を中心に、その基本的な使い方から具体的な操作方法までを詳細に解説しました。
openpyxl
を使えば、Pythonスクリプトから.xlsx
ファイルの新規作成、読み込み、書き込み、シートの操作(作成、削除、名前変更、移動)、そしてセルの書式設定(フォント、色、罫線、配置など)といった様々な操作を自動化できます。- 基本的な考え方は、ワークブック、ワークシート、セルといったExcelの階層構造をPythonのオブジェクトとして捉え、それらを操作することです。
- データの読み書きには、セル座標や行番号/列番号によるアクセス、
iter_rows()
やappend()
のようなメソッドが便利です。 - 複雑なデータ処理や複数のファイルの集計には、
pandas
のようなデータ分析ライブラリが強力な味方になります。 - Excelアプリケーション自体を操作したい場合やVBA連携が必要な場合は、
xlwings
という選択肢があります。 - エラーハンドリングやデバッグの基本的な手法を知っておくことで、より堅牢なプログラムを作成できます。
- 大きなファイルを扱う際のパフォーマンスやメモリ使用量には注意が必要であり、
read_only
やwrite_only
といったオプションが役立ちます。
PythonとExcelを組み合わせることで、これまで手作業で行っていた定型的な作業を大幅に効率化し、より複雑なデータ処理も短時間で行えるようになります。この記事を参考に、ぜひあなたのExcel作業自動化にチャレンジしてみてください。
次のステップ
- この記事で紹介したコードを実際に動かしてみましょう。様々なExcelファイルで試してみてください。
- ご自身の実際の業務で発生するExcel作業の中で、自動化できそうなものを見つけてスクリプトを書いてみましょう。
openpyxl
の公式ドキュメント(英語ですが、コード例が豊富です)も参考に、さらに高度な機能(条件付き書式、データ検証など)に挑戦してみましょう。- データ分析に興味があれば、
pandas
ライブラリの学習に進んでみましょう。 - Excelとのより深い連携が必要であれば、
xlwings
を調べてみましょう。
Pythonを使ったデータ処理と自動化の世界は非常に広いです。一歩ずつ進んでいけば、きっとあなたの仕事や学習に役立つ強力なツールを手に入れることができるはずです。
参考資料
- openpyxl 公式ドキュメント: https://openpyxl.readthedocs.io/en/stable/ (英語)
- pandas 公式ドキュメント: https://pandas.pydata.org/docs/ (英語)
- xlwings 公式ドキュメント: https://docs.xlwings.org/ (英語)