(1時間4,000円の伴走型ビデオチャット指導も受付中!)
PythonでExcel操作を自動化する:openpyxlの基本から実践的なテクニックまで
![]()
【Yuki】
Hirokiくん、こんにちは。今日はPythonを使ってExcelファイルを操作するためのライブラリ、「openpyxl」についてお話ししようと思います。Excelは学校や仕事など、いろいろな場面で使われていますよね。それをプログラムで自動化できたら、とっても便利だと思いませんか……?
![]()
【Hiroki】
Yukiさん、こんにちは!Excelの自動化、すごく興味があります。手作業でデータを入力したり、集計したりするのは時間がかかるので、Pythonでパッと終わらせられたら嬉しいです。初心者でも扱えるものなんでしょうか?
![]()
【Yuki】
はい、大丈夫ですよ。openpyxlは非常に人気のあるライブラリで、書き方も直感的ですから、プログラミングに慣れていないHirokiくんでも、少しずつ学べばきっと使いこなせるようになると思います。今日は基本的な使い方から、ちょっとした応用まで一緒に見ていきましょうね。
openpyxlとは何か?
![]()
【Yuki】
まず、openpyxlについて簡単に説明しますね。これはPythonでExcelファイル(拡張子が .xlsx / .xlsm など)を読み書きするためのライブラリです。
Excelを立ち上げることなく、プログラムから直接シートを作ったり、値を書き込んだり、グラフを作成したりできるんですよ。
![]()
【Hiroki】
Excelをインストールしていなくても、ファイルを作れるんですか?
![]()
【Yuki】
ええ、その通りです。Pythonが動く環境であれば、Excelソフトそのものがなくてもファイルを作成・編集できるのが大きなメリットですね。
ただ、古い形式の .xls ファイルには対応していないので、そこだけは注意が必要かもしれません。
準備:ライブラリのインストール
![]()
【Yuki】
では、さっそく準備を始めましょう。openpyxlは標準ライブラリではないので、まずはインストールする必要があります。ターミナルやコマンドプロンプトで、以下のコマンドを入力してみてください。
pip install openpyxl
![]()
【Hiroki】
インストールできました!これで準備完了ですね。
![]()
【Yuki】
はい、準備万端です。では、まずは「新しくExcelファイルを作って保存する」という一番シンプルなプログラムから書いてみましょう。
ワークブックの作成と保存の基本
![]()
【Yuki】
まずは、Excelのファイル全体を表す「Workbook」というオブジェクトを作成します。
import openpyxl
# 新しいワークブックを作成します
wb = openpyxl.Workbook()
# 現在アクティブなワークシートを選択します
ws = wb.active
# タイトルを変更してみます
ws.title = "SampleSheet"
# ファイルを保存します
wb.save("sample.xlsx")
![]()
【Hiroki】
これだけでファイルが作れるんですね!wb.activeというのは何ですか?
![]()
【Yuki】
Excelファイルを開いたときに、最初に表示されるシートのことだと思ってください。新しくワークブックを作ると、デフォルトで1枚のシートが含まれているので、それを使っているんです。
![]()
【Hiroki】
なるほど。保存する時の名前は、save()の引数で決めるんですね。
セルへの書き込みと読み取り
![]()
【Yuki】
次は、実際にセルへデータを書き込んで、それを読み取ってみましょう。セルの指定方法は、Excelでおなじみの「A1」のような形式を使う方法と、行と列の番号で指定する方法の2通りがあります。
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
# A1セルに値を書き込みます
ws["A1"] = "こんにちは、Python!"
# 行と列の番号で指定することもできます(1始まりです)
ws.cell(row=2, column=1, value=123.45)
# 値を読み取って表示してみます
print(ws["A1"].value)
print(ws.cell(row=2, column=1).value)
wb.save("cell_test.xlsx")
![]()
【Hiroki】
ws["A1"]という書き方は、辞書みたいで分かりやすいですね。でも、ws.cell(row=2, column=1)という書き方はどんな時に使うんですか?
![]()
【Yuki】
それは良い質問ですね。例えば、ループ処理を使ってたくさんのデータを書き込みたいときは、数字で指定できるws.cell()の方が圧倒的に便利なんです。変数を使って、行番号や列番号を1ずつ増やしながら処理を回せますから。
セルの範囲操作とループ処理
![]()
【Yuki】
では、そのループ処理についてもう少し詳しく見ていきましょう。複数のセルを一度に扱いたいときは、「スライス」のような書き方や、iter_rows()というメソッドを使います。
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
# データを流し込んでみます
data = [
["商品名", "単価", "数量"],
["りんご", 100, 5],
["バナナ", 80, 10],
["メロン", 500, 2],
]
for row in data:
ws.append(row)
# 範囲を指定して読み取ります
# A1からC4までの範囲をループします
for row in ws["A1:C4"]:
for cell in row:
print(cell.value, end=" ")
print() # 改行
wb.save("loop_test.xlsx")
![]()
【Hiroki】
ws.append()というのがあるんですね!リストを渡すだけで、自動的に次の行に追加してくれるのは便利です。
![]()
【Yuki】
そうなんです、1行ずつまとめて追加したいときにはとても重宝しますよ。ws["A1:C4"]のように範囲を指定すると、各行がタプルとして返ってくるので、それを二重のループで処理するのが一般的です。
![]()
【Hiroki】
もし、特定の列だけ、あるいは特定の行だけを全部読み取りたいときはどうすればいいですか?
![]()
【Yuki】
その場合は、ws.iter_rows() や ws.iter_cols() を使うのがおすすめです。
例えば、ws.iter_rows(min_row=2, max_row=4, min_col=1, max_col=3) のように引数を指定することで、必要な部分だけを柔軟に取り出すことができます。
セルの装飾とスタイル設定
![]()
【Yuki】
さて、ここからは少し見た目のお話をしましょうか。Excelといえば、色を塗ったりフォントを太くしたりといった「装飾」も大切ですよね。
実は、わたし……Webデザインも好きなので、フォントの種類や配置がズレていたりすると、気になって夜も眠れなくなっちゃうんです……。
![]()
【Hiroki】
えっ、そうなんですか?Yukiさん、こだわりが強そうですね。
![]()
【Yuki】
ええ、少しだけ……。Excelでも、openpyxlを使えば細かいスタイル設定が可能です。openpyxl.stylesから必要なクラスをインポートして使います。
from openpyxl import Workbook
from openpyxl.styles import Font, Color, PatternFill, Alignment, Border, Side
wb = Workbook()
ws = wb.active
# フォントの設定:太字、色、サイズ、フォント名
font = Font(name='Meiryo UI', size=14, bold=True, color="FF0000")
ws['A1'].font = font
ws['A1'] = "強調されたテキスト"
# 背景色の設定(塗りつぶし)
fill = PatternFill(patternType='solid', fgColor='CCEEFF')
ws['A2'].fill = fill
ws['A2'] = "背景色が水色のセル"
# 配置の設定:中央揃え
align = Alignment(horizontal='center', vertical='center')
ws['A3'].alignment = align
ws['A3'] = "中央揃え"
# 枠線の設定
side = Side(style='thin', color='000000')
border = Border(left=side, right=side, top=side, bottom=side)
ws['A4'].border = border
ws['A4'] = "枠線あり"
# 列の幅を調整する
ws.column_dimensions['A'].width = 30
wb.save("style_test.xlsx")
![]()
【Hiroki】
おお、本格的なExcelファイルっぽくなってきました!色の指定は、Webと同じように16進数のカラーコードを使うんですね。
![]()
【Yuki】
その通りです。ただ、色の指定に「#」は含めないので注意してくださいね。
こうしてプログラムから見た目を整えられるようになると、レポート作成を完全に自動化することも夢じゃありません。見やすい表は、読む人への優しさだ……とわたしは思います。
数式とグラフの挿入
![]()
【Hiroki】
Yukiさん、Excelといえば「合計」を出したりする数式もよく使いますよね。それもPythonから書き込めるんですか?
![]()
【Yuki】
もちろんですよ。といっても、実はとても簡単で、セルに文字列として数式を書き込むだけなんです。
ws["B5"] = "=SUM(B2:B4)"
![]()
【Hiroki】
あ、そのまま書けばいいんですね!
![]()
【Yuki】
はい、Excel側がファイルを開いたときに計算してくれます。
さらに、openpyxlではグラフを描くこともできるんですよ。簡単な棒グラフを作る例を見てみましょう。
from openpyxl.chart import BarChart, Reference
# データの範囲(値がある場所)を指定します
values = Reference(ws, min_col=2, min_row=2, max_col=2, max_row=4)
# カテゴリの範囲(ラベルがある場所)を指定します
categories = Reference(ws, min_col=1, min_row=2, max_row=4)
chart = BarChart()
chart.add_data(values)
chart.set_categories(categories)
chart.title = "売上集計"
# シートの指定した位置にグラフを貼り付けます
ws.add_chart(chart, "E2")
![]()
【Hiroki】
すごい、グラフまで自動で作れるなんて。これなら大量のデータから一気にグラフ付きの資料を作れますね。
既存のファイルを読み込んで編集する
![]()
【Hiroki】
今までは新しくファイルを作る方法でしたが、すでにあるExcelファイルを開いて、一部を書き換えることもできますか?
![]()
【Yuki】
ええ、もちろんです。その場合は load_workbook という関数を使います。
from openpyxl import load_workbook
# 既存のファイルを読み込みます
wb = load_workbook("sample.xlsx")
ws = wb.active
# データを上書きしたり追加したりします
ws["A1"] = "内容を更新しました"
# 別名で保存、あるいは同じ名前で保存します
wb.save("sample_updated.xlsx")
![]()
【Yuki】
ただし、一つだけ気をつけてほしいことがあります。
もし読み込むExcelファイルの中に、openpyxlがサポートしていない高度な機能(特殊なマクロや非常に複雑なグラフなど)が含まれている場合、保存した時にそれらが消えてしまう可能性があるんです……。
大切なファイルを操作するときは、必ずバックアップをとってから試すようにしてくださいね。
![]()
【Hiroki】
バックアップ、大事ですね。気をつけます。
実践的なデータ集計の例
![]()
【Yuki】
最後に、学んだことを組み合わせて少し実践的なことをしてみましょう。
「複数の注文データが並んでいるシートから、特定の条件に合うものだけを別シートに抽出する」という処理を考えてみます。
import openpyxl
# 元データの作成(実際は既存のファイルを読み込むことが多いです)
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "OrderData"
data = [
["注文ID", "商品", "金額"],
["101", "PC", 120000],
["102", "マウス", 3000],
["103", "キーボード", 8000],
["104", "モニター", 35000],
]
for row in data:
ws.append(row)
# 抽出用の新しいシートを作ります
extract_ws = wb.create_sheet("HighValueOrders")
extract_ws.append(data[0]) # ヘッダーをコピー
# 金額が10,000円以上のデータだけを抽出して新しいシートに書き込みます
for row in ws.iter_rows(min_row=2, values_only=True):
# row[2] が金額の列です
if row[2] >= 10000:
extract_ws.append(row)
# 抽出したデータの金額部分を太字にします
from openpyxl.styles import Font
bold_font = Font(bold=True)
for row in extract_ws.iter_rows(min_row=2, min_col=3, max_col=3):
for cell in row:
cell.font = bold_font
wb.save("orders_processed.xlsx")
![]()
【Hiroki】
これですね!僕がやりたかったのはこういうことです。
values_only=True というのはどういう意味ですか?
![]()
【Yuki】
通常、iter_rows() で取得できるのは「セルオブジェクト」なのですが、values_only=True を指定すると、セルの「値」だけを直接取り出すことができるんです。
書式などは気にせず、データの中身だけをササッとチェックしたいときに便利ですよ。
![]()
【Hiroki】
なるほど。wb.create_sheet() でシートを増やすこともできるんですね。
これなら、毎日の面倒な仕分け作業も一瞬で終わりそうです。
![]()
【Yuki】
そう言ってもらえると嬉しいです。
プログラムは、一度書いてしまえば何度でも同じ作業を正確に繰り返してくれます。
空いた時間で、自分の好きなこと……例えば、ゆっくり読書をしたり、美味しいお菓子を食べたりすることもできるようになりますから。
![]()
【Hiroki】
はい!まずは自分の身の回りのExcelファイルで試してみます。
Yukiさん、今日も丁寧に教えてくれてありがとうございました。
![]()
【Yuki】
どういたしまして。もし途中で分からなくなったら、いつでも聞いてくださいね。
公式のドキュメントも、英語ですけれど情報が豊富で参考になりますよ。
![]()
【Yuki】
……あ、最後にもう一つだけ。
Excelファイルを保存する際、もしそのファイルを別のソフトで開いたままだと、エラーが出て保存に失敗してしまいます。
実行するときは、Excelソフトでそのファイルを閉じておくのを忘れないようにしてくださいね。わたしも、たまに閉め忘れてエラーを出してしまうことがあるので……。
![]()
【Hiroki】
わかりました、気をつけます(笑)。
![]()
【Yuki】
ふふ、それじゃあ今日はここまでにしましょうか。
また次回、お会いできるのを楽しみにしています。
「openpyxl」のサンプルコードを見る
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

