こんにちは。はじめまして。かつひさ(@katsuhisa__)です。
異なるExcelファイル間で、地道なコピー&ペーストを繰り返してデータを移動しなければならない時や、特定のセルを目視で見つけなければならない時ってありませんか?
本連載では、PythonのOpenPyXLモジュールを使い、このような面倒で退屈なExcel作業をPythonで自動化する方法をお伝えします。
連載一記事目となる今回は、PythonでExcelファイルを操作するモジュールOpenPyXLのはじめての使い方(初心者向け)をご紹介します!
OpenPyXLとは?
OpenPyXLは、Excelの読み書きをPythonで行うためのモジュールです。
例えば、以下のような操作ができます。
- セルの値をPythonで読み書きする
- 複数のExcelファイル間でデータをコピーする
- グラフを追加する
Excelの操作を自動化するモジュールと書きましたが、実はExcel でなくとも構いません。大事なことは、拡張子が「.xlsx」であることです。
あまり馴染みがないかもしれませんが、LibreOffice CalcやOpenOffice Calcを使えば、「.xlsx」ファイル形式を操作できます。ですので、Macユーザーの方は是非これらのソフトを使ってみて下さい。(どちらも無料で利用できます。)
OpenPyXLモジュールをインストールする
まずは、OpenPyXLモジュールをインストールします。
※ 本連載は、Python自体のかんたんな使い方について理解されている方を対象にしています。「モジュール?ん?」となってしまった方は、タカハシさんがすで書かれている以下記事を参考に、Pythonの使い方への理解をまずは深めてみてください。
ただ、本連載の目的はあくまでもPythonでExcel操作を自動化することなので、あまり深く考えず写経していただいても構いません。みんなそうやって大人になっていくんだと思います。
OpenPyXLでExcelを開くための準備
早速ですが、OpenPyXLでExcelを開いてみましょう!
・・・その前に、サンプルとなるExcelファイルを用意します。(手元に操作したいExcelファイルがある場合は、もちろんそれを利用していただいて構いません。)
Excelサンプルファイルを用意する
今回は、オライリー・ジャパンの『退屈なことはPythonにやらせよう』が公開してくれているサンプルを利用します。
以下リンク先のDownloadを押してもらえればOKです。
「example.xlsx」というExcelファイルがダンロードされます。
早速ファイルの中身を見てみましょう。
以下のようであればOKです!
Excelファイルを作業フォルダに移動する
次に、ダウンロードしたExcelファイルを、Pythonを動かしている環境と同じディレクトリに移動(コピー)します。←重要
※現在Pythonを動かしているディレクトリが分からない場合は、osモジュールをインストール(pip install os)し、os.getcwd()を実行すればOKです。
import os
os.getcwd()
プログラミング初心者にとっては、こういう細かい環境設定の1つ1つがたいへんだと思いますが、誰もが通る道だと思いますので、がんばりましょう。
何か分からないことがあれば、いつでも私(@katsuhisa__)にご連絡いただいて構いません。
OpenPyXLでExcelを開く
さて、今度こそOpenPyXLでExcelの情報を取得してみましょう。
Excelのシート名を取得する
まずは、手始めにシート名を取得しましょう。
import openpyxl
wb=openpyxl.load_workbook('example.xlsx')
wb.get_sheet_names()
[‘Sheet1’, ‘Sheet2’, ‘Sheet3’] と値が返ってきたら成功です。
もし、うまくいかない場合は、タイポ(文字の打ち間違え)をしていないか等、見直してみて下さい。
ここで、利用しているメソッドの補足説明をします。
ワークブックオブジェクトの取得
openpyxl.load_workbook(ファイル名)メソッドは、ファイル名を引数にとり、ワークブックのオブジェクトを返します。
Excelファイルが作業ディレクトリに存在していないと、正しく動作しない点にご注意くださいね。
※本記事では、すでにexample.xlsxを作業ディレクトリに移動しました。
シート名の取得
ワークブックオブジェクト.get_sheet_names()メソッドを使うと、ワークブックに含まれるシートの名前の一覧を取得できます。
また、ワークブックオブジェクト.get_sheet_by_name(‘Sheet1’)のように記述すると、指定した文字列と一致したシート(ここでは、Sheet1)を取得できます。
シートを取得すると、ようやくセルの値を取り扱うことができるようになります。では、さっそくセルの値を取得する方法を学習しましょう。
Excelのセルの値を取得する
import openpyxl
wb =openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
sheet['A1'].value
datetime.datetime(2015, 4, 5, 13, 34, 2) と返ってきたら成功です。
セルオブジェクトには、valueという属性があるので、sheet[‘A1’].valueと記述すると、セルの値を取得できます。
・・・しかし、この指定方法は、プログラムにとっては扱いづらいですね。
なぜなら、プログラムで繰り返しExcelの情報を取得することを考えた場合に、A1, B1, C1 …と指定するよりも、11, 21, 31 …と指定する方が、繰り返しを行いやすいからです。
そこで、最後に行(row)と列(column)を使い、Excelのセルを指定する方法をご紹介します。
Excelのセルの値を取得する方法2
さっそくサンプルコードを見てみましょう。
import openpyxl
wb =openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
sheet.cell(row=1, column=1).value
今回も、datetime.datetime(2015, 4, 5, 13, 34, 2) と返ってきたら成功です。
行と列を指定し、セルの値を取得する
このように記述すると、指定した行数番号と列数番号に対応するセルのオブジェクトが取得できます。また、前述しましたがセルオブジェクトにはvalue属性があるので、シートオブジェクト.cell(row=行数番号, column=列数番号).valueと記述すると、セルの値を取得できます。
利用時の注意点としては、列数番号は、ABC… ➔ 123…に対応します。ですので、今回のサンプルコード(sheet.cell(row=1, column=1))の場合は、A1セルが取得されます。
プログラミングに徐々に慣れつつある方にとっては、数字が0から始まらず、1から始まっている点に違和感を感じるかもしれませんが、OpenPyXLでは、先頭の行と列は1ですので、ご注意ください。
さいごに
以上、PythonでExcelファイルを操作するモジュールOpenPyXLのはじめての使い方(初心者向け)をご紹介しました!
今後の連載では、「PythonでExcelデータ集計を自動化する 」方法や、「PythonでExcelに文章を書き出す 」方法、さらには、「PythonでExcelにグラフを描画する」方法についてもご紹介する予定です。
本連載の更新情報は、管理人のタカハシ(@ntakahashi0505)さんのTwitterアカウントや、もちろん私のアカウント(@katsuhisa__)で配信していくので、もしよければ、フォローをお願いします!
↓連載二記事目が公開されました!
書籍『Pythonでかなえる Excel作業効率化』発売のお知らせ
この連載が『Pythonでかなえる Excel作業効率化』という本になりました! Pythonの使い方の基本からだけでなく、Pythonでオフィス業務を効率化するために必要な知識をたくさん詰め込みました!ぜひお買い求めください。連載目次:PythonでExcelを操作するモジュールOpenPyXL
OpenPyXLというモジュールを使うことでPythonでExcelファイルを操作することができます。本シリーズでは初心者向けにExcelファイルの作業をPythonで自動化する方法をお伝えします。- PythonでExcel作業を自動化するOpenPyXLのはじめての使い方
- OpenPyXLで複数のセルの値を取得する方法
- OpenPyXLでExcelファイルの新規作成・保存を行う方法
- PythonでOpenPyXLを使ってExcelのシートを追加・削除する方法
- PythonでOpenPyXLでExcelのセルに値を入力する方法と編集する方法
- PythonでOpenPyXLを使いExcelのフォントを設定する方法
- PythonでOpenPyXLを使いExcelに数式を入力する方法
- PythonでOpenPyXLを使いExcelの行と列について色々な設定をする方法
- PythonでOpenPyXLを使いExcelの行と列を固定する方法
- PythonでOpenPyXLを使いExcelのグラフを作成する〜Chart関連オブジェクトの紹介〜
- PythonでOpenPyXLを使いExcelのグラフを作成する〜グラフのつくりかた編〜
コメント
はじめまして。VBAを扱っているエンジニアです。
Excelでの作業の自動化はVBAやVSBを用いているのですが
「拡張子が「.xlsx」であればOpen Office等でも使える」以外でOpenPyXLを用いるメリットはありますか?
ゆっけさん
コメントありがとうございます。
Excel(またはWindows)に関する操作だけであればVBA・VBSで十分だと思います。
VBA・VBSで提供されていない機能が、Pythonのライブラリでは提供されていて、それを使いたい!というときにOpenPyXLを使うと良いのではないかと思います。
はじめまして、こちらぜひ使いたいと思っており、試してみましたが、
どうも、どの環境でも下記が出てしまい、シート名が取得出来ません。
なにが違っているのでしょうか。。
DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
wb.get_sheet_names()
michaelさん
コメントありがとうございます。
使っているソフトウェアのバージョンが新しくなると、
「古いメソッドを新しいメソッドに変えることを推奨します」という警告を出すことがあり、今回はそれです。
私がつかっているOpenPyXLのバージョンと、michaelさんがつかっているバージョンが異なっているため、このメッセージが出ています。
メッセージに「Use wb.sheetnames」と書いてある通り、
そちらのメソッドを使うことが推奨されているみたいです。
get_sheet_names() の代わりに、wb.sheetnamesを使用してみてください。
ちなみに少し先回りもして回答をいたしますが、
wb.sheetnameメソッドも非推奨になっており、
wb[‘Sheet1’]
という書き方をする必要がありますので、その際もご注意くださいね。
記事の方がバージョンが古いので、今度修正します。
コメントありがとうございました!
pythonでexcelを扱うことができるんですね。勝手に一人でかんどうしてました。!!とてもわかりやすくて勉強になります。ありがとうございます。^^
annapurnaさん
コメントありがとうございます!
ぜひご活用くださいませ!
Excel関数止まりの者です。
とうとうVBAには興味が持てず、何故だかPythonが気になって数年。
そのような思いが何周か回って、このサイトに辿り着きました。
紹介されていた『退屈なことはPythonにやらせよう』を、思わず購入してしまいましたよ。
実務におけるExcel……というか自分の限界を感じており、プログラミングなど無縁な私がExcelとPythonの連携とは、ちょっと無謀な試みだとは分かっているのですが。
何だかワクワクしております♪