【Python】「OpenPyXL」で「Excel」のワークブック、ワークシートを操作してみよう

python

みなさんこんにちは。zak-papaです。

Excel業務の自動化を考える際に真っ先に思い付くのが「VBA」だと思いますが、実はPythonからもExcelを自在に操ることができます。

Excelと言っても「Microsoft社」のExcelだけではなく、「.xlsx」ファイル形式であれば操作可能ということです。
無料の互換性ソフトである「Libre Office Calc」「Open Office Calc」もどちらも「.xlsx」ファイル形式を操作できます。Excelが使えない場合はこれらのソフトを使ってみるのも良いでしょう。

 

PythonでExcelを扱うことができれば、Pythonの得意なWeb上の情報をスクレイピング → その内容をExcelに出力 → チームメンバーと共有 なんて使い方もできます。

そんなExcelを自在に操れる「OpenPyXL」ライブラリのインストールから「ワークブック」「ワークシート」の基本操作について本記事でご紹介したいと思います!
(「セル」の操作については次回説明します)

python【Python】「OpenPyXL」で「Excel」のセルの値を取得・入力するなどセルを操作してみよう

 

「OpenPyXL」をインストールしよう

事前準備

まずはデスクトップ上に「openpyxl」ディレクトリ(フォルダ)を作成し、その中に「openpyxl_practice.py」ファイルを作成して作業していきます。

私の動作環境は次の通りです。ご自身の使い慣れているものをお使いいただければと思います。
Windowsでも同じように動作すると思います。

OS macOS Catalina 10.15.3 Version Python 3.7.4
エディタ Visual Studio Code ブラウザ Google Chrome
ディレクトリ Desktop/openpyxl ファイル openpyxl_practice.py

 

desktop_openpyxl

※ Excelをインストールしていない場合は、冒頭で説明したソフトで代用していただければと思います。

 

 

OpenPyXLをインストールする

上記準備が完了したらターミナルで次のように入力して「OpenPyXL」をインストールしましょう。
※ 環境によっては「pip3」でインストール

 

openpyxlインストール

 

 

次のようになっていればインストール完了です。

openpyxlインストール完了

 

 

また、Pythonではライブラリを「インストール」しただけでは使用できません。
次のように「import openpyxl」と記述して、まずは「インポート」する必要があります。その後にExcelを操作するコードを書いていきましょう。

openpyxlインポート

 

 

「ワークブック」を操作してみよう

「OpenPyXL」でExcelを操作する場合に、次の3ステップを踏むことが必要です。

「OpenPyXL」でExcel操作をするための3ステップ
  1. ワークブックの取得(指定)
  2. ワークシートの取得(指定)
  3. セル範囲の取得(指定)

 

つまり、

①どの「ワークブック(Excelファイル)」の
②どの「ワークシート」の
③どの「セル」に対して処理するか
 を取得(指定)する必要があります。

Excelファイル

 

 

なので、まずは「ワークブック(Excelファイル)」を取得する方法から順に見ていきましょう。
取得方法は大きく2つあります。

「ワークブック」を取得する方法
  1. 新規作成した「ファイル」(そのまま使用)
  2. 既に存在する「ファイル」の「ファイル名」から取得

 

順に見ていきましょう。

 

 

ワークブックを「新規作成」する

まずは、ワークブックを新規作成します。
ワークブックを新規作成する場合は「Workbook()」関数を使います。

実際は、次のように「Workbook()」関数で作成したワークブックオブジェクトを変数(wb)に代入して、その後に何かしら処理を行い、「save()」メソッドによって名前を付けて保存、「close」メソッドでファイルを閉じる流れとなります。

 

 

上記を実行すると無事フォルダにファイル名付きで新規作成されましたね。

Desktop_openpyxl

openpyxl_pactice.xlsx

 

 

ワークブックを「ファイル名」から取得する

次に、ワークブックを「ファイル名」から取得する方法を見ていきましょう。

「load_workbook()」関数を使って次のようにファイル名を取得します。

 

 

上記のコードはpythonファイル(.py)とExcelファイル(.xlsx)が同じディレクトリ(フォルダ)内にあることが前提となった書き方です。

もし、1つ上の階層のフォルダである「デスクトップ」にファイルがある場合は、4行目のようにファイルの「場所」も指定して書きます。また、保存するときも同じ場所を指定すると上書き保存されます。

 

 

以上のように、同じディレクトリ(フォルダ)内にファイルがない場合は、ファイルの「場所」も指定する必要があるので覚えておきましょう。

 

 

「ワークシート」を操作してみよう

続いて、「ワークシート」を取得する方法を見ていきましょう。
こちらも2つの取得方法を覚えておきましょう。

「ワークシート」を取得する方法
  1. 「アクティブ」なワークシートを取得
  2. 「シート名」でワークシートを取得

 

 

アクティブなワークシートを取得する

「ワークブック」は少なくとも1つの「ワークシート」で構成されており、必ずどれか1つの「ワークシート」を指定している状態となっています。
その指定された「ワークシート」を「アクティブ」な「ワークシート」といい、名前の通り「active」プロパティを使って取得することができます。

※「アクティブ」なワークシートはデフォルトで一番左(インデックスが「0」)となり、新規作成した際に「sheet1, sheet2, sheet3」と3つが作成されている場合は「sheet1」がアクティブなワークシートになります。

 

次のワークブックで考えてみましょう。
ワークシートが1つしかないので、アクティブなワークシートは「Sheet」になりますね。

Sheet

 

実際に「Sheet」がアクティブなものかprint()で出力して確認してみます。(7行目)

※ シート名だけ取得する場合は「print(ws.title)」とします。

 

ちゃんと「Sheet」が取得できていますね。

アクティブなワークシート

 

 

では、次のように「sample1」「Sheet」「sample2」の3つのワークシートがあり、「sample2」が選択された状態で保存されてあった場合、「アクティブ」なワークシートはどれになるでしょうか。
上記と同じコードで出力してみます。

sample2

 

「sample2」が「アクティブ」なワークシートですね。
上記ではデフォルトで「一番左」とお伝えしましたが、既に「sample2」が選択された状態で保存されていれば、そのワークシートが「アクティブ」なワークシートになります。

アクティブなワークシート_sample2

 

 

 

ワークシートを「シート名」から取得する

上記の「アクティブ」なワークシートは、1つのワークシートを使用する場合や一番左にあるワークシート以外は使用しないという場合は良いかもしれませんが、途中でどのワークシートが「アクティブ」なものかわからなくなる場合もあります。

なので、「シート名」でワークシートを取得する方法もよく使われ、「wb["取得するワークシート名"]」のように記述して取得します。

 

では、次の「sample」シートを取得してみましょう。

sampleシート

 

 

コードはこちら。6行目で「sample」シートを取得しています。無事取得できましたね。

 

sampleシートの取得

 

 

「get_sheet_by_name()」メソッドについて

「シート名」でワークシートを取得する他の方法に「get_sheet_by_name()」 メソッドがあります。このメソッドで先ほどと同じく「sample」シートを取得してみます。(6行目)

 

そうすると、次のようにターミナル上に表示されます。

DeprecatingWarning

 

「DeprecationWarning」は「非推奨」であるという警告であり、そのすぐ後に記載されている「wb[sheetname]」(sheetnameには「シート名」が入る)を使いなさいと指示があります。
なので、今後は上記で説明した書き方でワークシートを取得するようにしましょう。

 

なお、全てのシートをリストで取得する「get_sheet_names()」メソッドも同様に警告が表示されます。この場合も「wb.sheetnames」属性を使うようにしましょう。(後述)

 

 

「ワークシート」を操作してみよう_2

続いて、「ワークシート」を取得する方法以外の操作について順に見ていきましょう。

ワークシートの「シート名を変更」する

「シート名」を変更するには「title」属性を使います。

では、先ほどのExcelファイルの一番左のシート名(Sheet)を「new title」に変更します。(7行目)

 

「Sheet」が「new title」に変更されましたね。

new_titleシート

 

 

ワークシートを「新規作成」する

新規でワークシートを作成する場合は「create_sheet()」メソッドを使います。
引数に「新しく作成するワークシート名」を指定して作成することができますが、何も指定しない場合は「Sheet1」「Sheet2」... のように順番に「番号」が振られて作成されます。

なお、新規でワークシートを作成する場合は必ず一番「右」に作成されます。

openpyxl_create_sheet

 

 

では、シート名を「createsheet」と指定して作成してみましょう。(6行目)

 

一番右にワークシートが作成されましたね。

createsheet

 

 

では、一番右ではなく他の場所に作成したい場合はどうしたら良いでしょうか。その場合は、先ほどのシート名の後にインデックス(一番左のシートから「0, 1, 2...」)を入れて場所を指定することができます。

では、「firstsheet」というシート名を一番左(インデックス「0」)に作成してみましょう。(6行目)

 

今度は一番左に作成されましたね。

firstsheet

 

 

ワークシートを「すべて取得」する

ワークブックからすべてのワークシートを取得するには「sheetnames」属性を使ってリストで取得することができます。
※ 前述したように「get_sheet_names()」メソッドは「非推奨」となっているため、「sheetnames」属性を使いましょう。

 

では、現時点のワークシート(4つ)をリストで取得してみましょう。

 

無事4つ分リストで取得できましたね。

sheetnames

 

 

今度は、すべてのシートを1つずつ取得(出力)してみたいと思います。
リストから1つずつ取り出すには「for」文でループして取り出せましたね。

 

1つずつシート名を取得できましたね。

for文_sheet

 

 

ワークシートを「コピー」する

ワークシートをコピーするには「copy_worksheet()」メソッドを使って次のように書きます。
()の中は「シート名」ではなく「シートオブジェクト(つまり、「wb["sample"]」のような書き方)」であることに注意しましょう。

では、次の「sample」シートをコピーしてみましょう。

samplesheet

 

コードはこちら。

 

上記を実行すると、一番右に「sample」シートのコピーが作成されましたね。

samplesheet_copy

 

 

ワークシートを「コピー」する際の注意事項

ワークシートを「コピー」する際は次の点にご注意ください。

 

① シート内のデータは概ねコピーされるが、一部(画像やグラフなど)はコピーされない。
ワークブック間でワークシートをコピーできない。
③ ワークブックが「読み取り・書き込み」専用モードの場合はワークシートをコピーできない。

 

 

ワークシートを「削除」する

最後にワークシートを削除する2つの方法を見ていきましょう。

先ほどコピーした「sample Copy」シートをそれぞれの方法で削除します。
コードはこちら。どちらかをコメントアウトしてどちらのパターンも試していただければと思います。

 

こちらも()の中は「シート名」ではなく「シートオブジェクト(つまり、「wb["sample"]」のような書き方)」であることに注意しましょう。

※ シートを削除する方法として、remove_sheet()」メソッドがありますが、こちらも「非推奨」となっているため、下記2つのどちらかを使用するようにしましょう。

 

 

先ほどの4つのシートの状態に戻れば成功です。

samplesheet

 

 

  終わりに

以上、「OpenPyXL」のインストールからワークブック、ワークシートの基本操作をお伝えしました。

これで、まずはどの「ワークブック」の、どの「ワークシート」に対して操作するか指定することができました。
次回は、その指定した「ワークシート」の「セル」に対して、値を取得したり値を入力したりしてみたいと思います。

python【Python】「OpenPyXL」で「Excel」のセルの値を取得・入力するなどセルを操作してみよう

 

また、その他にも「OpenPyXL」では下記の操作も可能です。

  • グラフ
  • ピボットテーブル
  • 条件付き書式
  • 印刷設定      等

 

大抵のことはできてしまいますね。
公式サイト(OpenPyXL)」があるので、是非そちらも参考していただければと思います。
と言っても公式サイト慣れしていない方もいると思いますので、また本ブログでも他の操作方法について説明していきたいと思っています。

 

以上となります。最後まで読んでいただきありがとうございました!