PythonでExcel作業を自動化するOpenPyXLのはじめての使い方


こんにちは。はじめまして。かつひさ(@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モジュールをインストールします。

pip install openpyxl

※ 本連載は、Python自体のかんたんな使い方について理解されている方を対象にしています。「モジュール?ん?」となってしまった方は、タカハシさんがすで書かれている以下記事を参考に、Pythonの使い方への理解をまずは深めてみてください。

Pythonで標準ライブラリのモジュールをインポートして使ってみよう
一般ビジネスマンの初心者向けにPythonで簡単かつお仕事に役立つツールを作る方法を解説。今回は、osモジュールとgetcwd関数で標準ライブラリのモジュールのインポートと使い方をお伝えします。

ただ、本連載の目的はあくまでもPythonでExcel操作を自動化することなので、あまり深く考えず写経していただいても構いません。みんなそうやって大人になっていくんだと思います。

OpenPyXLでExcelを開くための準備

早速ですが、OpenPyXLでExcelを開いてみましょう!

・・・その前に、サンプルとなるExcelファイルを用意します。(手元に操作したいExcelファイルがある場合は、もちろんそれを利用していただいて構いません。)

Excelサンプルファイルを用意する

今回は、オライリー・ジャパンの『退屈なことはPythonにやらせよう』が公開してくれているサンプルを利用します。

以下リンク先のDownloadを押してもらえればOKです。

oreilly-japan/automatestuff-ja
automatestuff-ja - 『退屈なことはPythonにやらせよう』のリポジトリ

「example.xlsx」というExcelファイルがダンロードされます。

早速ファイルの中身を見てみましょう。
以下のようであればOKです!

Excelファイルを作業フォルダに移動する

次に、ダウンロードしたExcelファイルを、Pythonを動かしている環境と同じディレクトリに移動(コピー)します。←重要

※現在Pythonを動かしているディレクトリが分からない場合は、osモジュールをインストール(pip install os)し、os.getcwd()を実行すればOKです。

プログラミング初心者にとっては、こういう細かい環境設定の1つ1つがたいへんだと思いますが、誰もが通る道だと思いますので、がんばりましょう。

何か分からないことがあれば、いつでも私(@katsuhisa__)にご連絡いただいて構いません。

OpenPyXLでExcelを開く

さて、今度こそOpenPyXLでExcelの情報を取得してみましょう。

Excelのシート名を取得する

まずは、手始めにシート名を取得しましょう。

[‘Sheet1’, ‘Sheet2’, ‘Sheet3’] と値が返ってきたら成功です。

もし、うまくいかない場合は、タイポ(文字の打ち間違え)をしていないか等、見直してみて下さい。
ここで、利用しているメソッドの補足説明をします。

ワークブックオブジェクトの取得

openpyxl.load_workbook(ファイル名)

openpyxl.load_workbook(ファイル名)メソッドは、ファイル名を引数にとり、ワークブックのオブジェクトを返します。
Excelファイルが作業ディレクトリに存在していないと、正しく動作しない点にご注意くださいね。
※本記事では、すでにexample.xlsxを作業ディレクトリに移動しました。

シート名の取得

ワークブックオブジェクト.get_sheet_names()

ワークブックオブジェクト.get_sheet_names()メソッドを使うと、ワークブックに含まれるシートの名前の一覧を取得できます。

また、ワークブックオブジェクト.get_sheet_by_name(‘Sheet1’)のように記述すると、指定した文字列と一致したシート(ここでは、Sheet1)を取得できます。
シートを取得すると、ようやくセルの値を取り扱うことができるようになります。では、さっそくセルの値を取得する方法を学習しましょう。

Excelのセルの値を取得する

datetime.datetime(2015, 4, 5, 13, 34, 2) と返ってきたら成功です。
セルオブジェクトには、valueという属性があるので、sheet[‘A1’].valueと記述すると、セルの値を取得できます

・・・しかし、この指定方法は、プログラムにとっては扱いづらいですね。
なぜなら、プログラムで繰り返しExcelの情報を取得することを考えた場合に、A1, B1, C1 …と指定するよりも、11, 21, 31 …と指定する方が、繰り返しを行いやすいからです。

そこで、最後に行(row)と列(column)を使い、Excelのセルを指定する方法をご紹介します。

Excelのセルの値を取得する方法2

さっそくサンプルコードを見てみましょう。

今回も、datetime.datetime(2015, 4, 5, 13, 34, 2) と返ってきたら成功です。

行と列を指定し、セルの値を取得する

シートオブジェクト.cell(row=行数番号, column=列数番号)

このように記述すると、指定した行数番号と列数番号に対応するセルのオブジェクトが取得できます。また、前述しましたがセルオブジェクトには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__)で配信していくので、もしよければ、フォローをお願いします!

 

↓連載二記事目が公開されました!

OpenPyXLで複数のセルの値を取得する方法
Excel 間でのセルをコピーしたり、退屈な作業を、Pythonで自動化してみませんか?OpenPyXLを使えば、PythonでかんたんにExcel 作業を実現できます。本記事では、OpenPyXLで複数のセルの値を取得する方法をご紹介します!

連載目次:PythonでExcelを操作するモジュールOpenPyXL

OpenPyXLというモジュールを使うことでPythonでExcelファイルを操作することができます。本シリーズでは初心者向けにExcelファイルの作業をPythonで自動化する方法をお伝えします。
  1. PythonでExcel作業を自動化するOpenPyXLのはじめての使い方
  2. OpenPyXLで複数のセルの値を取得する方法
  3. OpenPyXLでExcelファイルの新規作成・保存を行う方法
  4. PythonでOpenPyXLを使ってExcelのシートを追加・削除する方法
  5. PythonでOpenPyXLでExcelのセルに値を入力する方法と編集する方法
  6. PythonでOpenPyXLを使いExcelのフォントを設定する方法
  7. PythonでOpenPyXLを使いExcelに数式を入力する方法
  8. PythonでOpenPyXLを使いExcelの行と列について色々な設定をする方法
  9. PythonでOpenPyXLを使いExcelの行と列を固定する方法

The following two tabs change content below.
B2B SaaSのスタートアップでSRE をやっています。 めんどうなことは出来る限り省力で済ませたいので、そのためのTips を書いていきます。

コメント

  1. ゆっけ より:

    はじめまして。VBAを扱っているエンジニアです。
    Excelでの作業の自動化はVBAやVSBを用いているのですが
    「拡張子が「.xlsx」であればOpen Office等でも使える」以外でOpenPyXLを用いるメリットはありますか?

    • ゆっけさん

      コメントありがとうございます。
      Excel(またはWindows)に関する操作だけであればVBA・VBSで十分だと思います。
      VBA・VBSで提供されていない機能が、Pythonのライブラリでは提供されていて、それを使いたい!というときにOpenPyXLを使うと良いのではないかと思います。

  2. michael より:

    はじめまして、こちらぜひ使いたいと思っており、試してみましたが、
    どうも、どの環境でも下記が出てしまい、シート名が取得出来ません。

    なにが違っているのでしょうか。。

    DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
    wb.get_sheet_names()

    • katsuhisa_ より:

      michaelさん

      コメントありがとうございます。
      使っているソフトウェアのバージョンが新しくなると、
      「古いメソッドを新しいメソッドに変えることを推奨します」という警告を出すことがあり、今回はそれです。
      私がつかっているOpenPyXLのバージョンと、michaelさんがつかっているバージョンが異なっているため、このメッセージが出ています。

      メッセージに「Use wb.sheetnames」と書いてある通り、
      そちらのメソッドを使うことが推奨されているみたいです。
      get_sheet_names() の代わりに、wb.sheetnamesを使用してみてください。

      ちなみに少し先回りもして回答をいたしますが、
      wb.sheetnameメソッドも非推奨になっており、
      wb[‘Sheet1’]
      という書き方をする必要がありますので、その際もご注意くださいね。

      記事の方がバージョンが古いので、今度修正します。
      コメントありがとうございました!