MAGAZINE

キャリテク!マガジン

コラム

Python外部ライブラリopenpyxlを使ってExcelの中身を読み取ろう!

こんにちは、吉政創成 菱沼です。

今回もPythonを使った自動化について、「シゴトがはかどるPython自動処理の教科書(著:クジラ飛行机様/マイナビ出版」を利用して学びますが、こちらのテキストを使用してのコラムは今回で最終回となります。Pythonに興味がある!という超初心者の方、最終回もぜひお付き合い頂ければ幸いです。

さて、前回は外部ライブラリを使うための方法の振り返りと、Excelの基本の確認、openpyxlの基本的な使い方として特定のセルに値を入れる方法や連続データの書き込みについて確認しました。
今回は、openpyxlを使った動作についてまとめたいと思います。

■ワークシートからデータを読み取ろう

前回は連続データの作成としてrange関数を使った九九表を最後に作成しました。
ここからはExcelのデータの取り出しや関数を使う方法について簡単にまとめたいと思います。

テキスト(P.72 TIPS)によれば、openpyxl自体はExcelの動作を模倣するもので、Excelの必要な機能は使えるものの、数式は完全に互換しているわけではないのだそうです。

そのため、Excel→openpyxlだとエラーになってしまうことがあるそうなのでご注意ください。ちなみにopenpyxl→Excelであれば制限はないそうなので、Excelと上手く組み合わせて使ってみましょう、とのことでした。

という事を踏まえた上で、進めてみたいと思います。
サンプルとして以下のExcelが用意されていますので、ここに保存されたデータを操作していきます。

Excelワークシートのデータを一つ読み取る方法

まずはサンプルコードです。

load_workbookはopenpyxlで利用できるモジュールの一つで、Excelファイルを読み込むことができます。
()にはファイル名を記述しますが、プログラムと違うフォルダに対象のExcelがあるようなら同じフォルダに移動するか、パスをきちんと指定してあげる必要があります。

複数あるワークシートから読み取るワークシートを指定したい場合

ところで、sheet = book.activeですが、これはワークシートを保存したときに開いているワークシートが対象となるようです。
そこで、ワークシートを指定したいときもあると思いますので、こう書いてみましたら上手くいきました。

取得したいデータの範囲を指定したい

①セルの番地を使用する方法と、②セル名を使用する方法、③iter_rowsで取得する方法があるそうです。

こちらはサンプルコードが参照するファイルの一部分ですが、このドラッグした部分を読み取ります。

①セルの番地を使用する方法

列と行の2つを指定してあげなくてはならないため、for文を2つ重ねます。
このサンプルコードでは2行目~4行目、2列目~4列目の値を取り出します。

②セル名を使用する方法

5行目までは同じなので割愛します。

セル名がそれぞれ「”」で囲われていますが、「”B2:D4”」でもいいそうです。
9~12行目をリスト内包表記で書き直せばより便利になるとのこと。

B2~D4に入っている値をrowに順番に入れていき、rowの値を変数cに格納し、変数cに今入っている値を取得して[]内に表示するという流れになります。
リスト内包表記については最後の方に参考リンクを書きましたので、そちらもご参照ください。

③ iter_rowsで取得する方法

イテレータ(iterator)というfor構文と組み合わせて、要素を反復して取り出す機能があるそうで、それを利用した方法になります。

iter_rowsはopenpyxlで利用できる関数の一つで、各行ごとにデータを取得したり、Excelデータを使いやすい形に整えたりといったことも可能になるそうです。
こちらも参考リンクを載せておきましたのでご確認ください。 こちらがサンプルコードです。5行目までは先ほどと同じなので割愛します。

(iter_rowsは任意の引数を省略できるため、max_rowとmax_colの引数を省略すると、最小行・最小列以降のすべての値を取得できるそうです。)

セル名から行列番号を、行列番号からセル名を取得したい場合

セル名か行列番号はわかっていても、もう一方の方で処理した方が楽なケースがあることは前回確認しました。
そうした時にパパっと確認できる方法があるそうです。それがこちら。

ここまででopenpyxlの基本となる操作方法が確認できたようです。
では次に、Excelの関数を利用したいときはどうするかを確認したいと思います。

■Excelの関数

さてこんなサンプルデータが用意されていました。

F列は数式(=個数*値段)が入っています。
これを先ほどのようにデータを取得するだけだと次のような結果になります。

最後の項目、数式のまま表示されます。
が、計算した結果を取り出したいですよね。

テキストによればPython自体で計算するのもいいけれど、openpyxlの機能を使って計算する方法があるのだそうです。
その方法が次になります。

すると、

無事計算結果が表示されるようになりました。

この後、テキストではopenpyxlを使って罫線を引く方法や複数のブック・シートを操作する(新規作成、コピー、削除、シート名変更など)方法について解説されていますが、文字数の都合上申し訳ないのですが、割愛させていただきます。参考サイトなどでご確認ください。

最後に暗号化されたExcelファイルの解析についてテキスト引用でご紹介します。

■暗号化されたExcelファイルを使いたい!

P.82
openpyxlライブラリだけを用いて、暗号化されたExcelを読むことはできません。そこで、msoffcrypto-toolライブラリを利用します。msoffcrypto-toolを使うと、暗号化したExcelやWordのファイルを暗号化できます。
(中略)
msoffcrypto-toolを使って、暗号化されたExcelファイルを読むには、次のようにします。

プログラムを実行すると、暗号化されたExcelファイル“uriage-encrypt.xlsx”を読み込んで、暗号を複合し、“uriage-encrypt.xlsx”に保存します。そして、Excelに書き込まれている内容を表示します。
続いて、プログラムを確認してみましょう。
まず*1の部分では、入力ファイルとして暗号化されているExcelファイルを指定します。そして、*2ではパスワードを指定します。ここでは“abcd”というパスワードを与えました。
*3では、暗号を複合化したデータを保存するファイルを指定します。そして、最後に*4でワークブックを読み込んで内容を表示します。
以上のように、パスワードがわかっていることが前提ですが、msoffcrypto-toolライブラリを使うことで、暗号化したExcelファイルを複合して利用できます。

とのことでした。

ところで、こちらのプログラムですが、AltXの講師の方によれば、本来、開いたファイルオブジェクトは閉じる処理をするところまで記述する作法があるのだそうです。

このプログラムで言えば5行目にある[open]がファイルオブジェクトを開くメソッドに当たりますが、閉じるためのメソッド[close]は確かにありません。

そこで、11行目の後に次のように追記します。

ファイルをcloseさせないとシステムリソースを余分に消費したり、他のプログラムでファイルにアクセスできなくなってしまうことがあったりするそうです。忘れないようにしたいですね。

さて、若干駆け足となってしまって申し訳ありませんが、Python自動処理の教科書を使用しての学習コラムは今回で終了となります。

こちらの書籍には使いこなせれば業務上でとても便利になりそうな情報がたくさんありましたので個人的に学習は続けていきたいと思います。

以下は参考サイトです。ご興味がある方は是非ご覧ください。

さて、次回からはPythonを使用したネットワーク自動化について学習していくことになります。
もし引き続きお付き合い頂ける方がいらっしゃいましたら嬉しいです。どうぞよろしくお願いいたします。

関連記事

facebook シェアシェア
LINE シェアシェア