みなさんこんにちは。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」ライブラリのインストールから「ワークブック」「ワークシート」の基本操作について本記事でご紹介したいと思います!
(「セル」の操作については次回説明します)

目次
「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 |
※ Excelをインストールしていない場合は、冒頭で説明したソフトで代用していただければと思います。
OpenPyXLをインストールする
上記準備が完了したらターミナルで次のように入力して「OpenPyXL」をインストールしましょう。
※ 環境によっては「pip3」でインストール
1 |
$ pip install openpyxl |
次のようになっていればインストール完了です。
また、Pythonではライブラリを「インストール」しただけでは使用できません。
次のように「import openpyxl」と記述して、まずは「インポート」する必要があります。その後にExcelを操作するコードを書いていきましょう。
「ワークブック」を操作してみよう
「OpenPyXL」でExcelを操作する場合に、次の3ステップを踏むことが必要です。
- ワークブックの取得(指定)
- ワークシートの取得(指定)
- セル範囲の取得(指定)
つまり、
①どの「ワークブック(Excelファイル)」の
②どの「ワークシート」の
③どの「セル」に対して処理するか を取得(指定)する必要があります。
なので、まずは「ワークブック(Excelファイル)」を取得する方法から順に見ていきましょう。
取得方法は大きく2つあります。
- 新規作成した「ファイル」(そのまま使用)
- 既に存在する「ファイル」の「ファイル名」から取得
順に見ていきましょう。
ワークブックを「新規作成」する
まずは、ワークブックを新規作成します。
ワークブックを新規作成する場合は「Workbook()」関数を使います。
実際は、次のように「Workbook()」関数で作成したワークブックオブジェクトを変数(wb)に代入して、その後に何かしら処理を行い、「save()」メソッドによって名前を付けて保存、「close」メソッドでファイルを閉じる流れとなります。
1 2 3 4 5 6 7 8 9 10 |
import openpyxl # 新規ワークブックの作成 wb = openpyxl.Workbook() # ここに何らかの処理を記述 # 保存して閉じる wb.save('openpyxl_practice.xlsx') wb.close() |
上記を実行すると無事フォルダにファイル名付きで新規作成されましたね。
ワークブックを「ファイル名」から取得する
次に、ワークブックを「ファイル名」から取得する方法を見ていきましょう。
「load_workbook()」関数を使って次のようにファイル名を取得します。
1 2 3 4 5 6 7 8 9 10 |
import openpyxl # 既に存在するファイルを開く wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # ここに何らかの処理を記述 # 保存して閉じる wb.save('openpyxl_practice.xlsx') wb.close() |
上記のコードはpythonファイル(.py)とExcelファイル(.xlsx)が同じディレクトリ(フォルダ)内にあることが前提となった書き方です。
もし、1つ上の階層のフォルダである「デスクトップ」にファイルがある場合は、4行目のようにファイルの「場所」も指定して書きます。また、保存するときも同じ場所を指定すると上書き保存されます。
1 2 3 4 5 6 7 8 9 10 |
import openpyxl # 既に存在するファイルを開く(場所指定) wb = openpyxl.load_workbook('/Users/ご自身のホーム名/Desktop/openpyxl_practice.xlsx') # ここに何らかの処理を記述 # 保存して閉じる(場所指定) wb.save('/Users/ご自身のホーム名/Desktop/openpyxl_practice.xlsx') wb.close() |
以上のように、同じディレクトリ(フォルダ)内にファイルがない場合は、ファイルの「場所」も指定する必要があるので覚えておきましょう。
「ワークシート」を操作してみよう
続いて、「ワークシート」を取得する方法を見ていきましょう。
こちらも2つの取得方法を覚えておきましょう。
- 「アクティブ」なワークシートを取得
- 「シート名」でワークシートを取得
アクティブなワークシートを取得する
「ワークブック」は少なくとも1つの「ワークシート」で構成されており、必ずどれか1つの「ワークシート」を指定している状態となっています。
その指定された「ワークシート」を「アクティブ」な「ワークシート」といい、名前の通り「active」プロパティを使って取得することができます。
※「アクティブ」なワークシートはデフォルトで一番左(インデックスが「0」)となり、新規作成した際に「sheet1, sheet2, sheet3」と3つが作成されている場合は「sheet1」がアクティブなワークシートになります。
次のワークブックで考えてみましょう。
ワークシートが1つしかないので、アクティブなワークシートは「Sheet」になりますね。
実際に「Sheet」がアクティブなものかprint()で出力して確認してみます。(7行目)
1 2 3 4 5 6 7 8 9 10 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # アクティブなワークシートを取得して出力 ws = wb.active print(ws) wb.save('openpyxl_practice.xlsx') wb.close() |
※ シート名だけ取得する場合は「print(ws.title)」とします。
ちゃんと「Sheet」が取得できていますね。
では、次のように「sample1」「Sheet」「sample2」の3つのワークシートがあり、「sample2」が選択された状態で保存されてあった場合、「アクティブ」なワークシートはどれになるでしょうか。
上記と同じコードで出力してみます。
「sample2」が「アクティブ」なワークシートですね。
上記ではデフォルトで「一番左」とお伝えしましたが、既に「sample2」が選択された状態で保存されていれば、そのワークシートが「アクティブ」なワークシートになります。
ワークシートを「シート名」から取得する
上記の「アクティブ」なワークシートは、1つのワークシートを使用する場合や一番左にあるワークシート以外は使用しないという場合は良いかもしれませんが、途中でどのワークシートが「アクティブ」なものかわからなくなる場合もあります。
なので、「シート名」でワークシートを取得する方法もよく使われ、「wb["取得するワークシート名"]」のように記述して取得します。
では、次の「sample」シートを取得してみましょう。
コードはこちら。6行目で「sample」シートを取得しています。無事取得できましたね。
1 2 3 4 5 6 7 8 9 10 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # 「sample」シートを取得して出力 ws = wb["sample"] print(ws) wb.save('openpyxl_practice.xlsx') wb.close() |
「シート名」でワークシートを取得する他の方法に「get_sheet_by_name()」 メソッドがあります。このメソッドで先ほどと同じく「sample」シートを取得してみます。(6行目)
1 2 3 4 5 6 7 8 9 10 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # 「sample」シートを取得して出力 ws = wb.get_sheet_by_name("sample") print(ws) wb.save('openpyxl_practice.xlsx') wb.close() |
そうすると、次のようにターミナル上に表示されます。
「DeprecationWarning」は「非推奨」であるという警告であり、そのすぐ後に記載されている「wb[sheetname]」(sheetnameには「シート名」が入る)を使いなさいと指示があります。
なので、今後は上記で説明した書き方でワークシートを取得するようにしましょう。
なお、全てのシートをリストで取得する「get_sheet_names()」メソッドも同様に警告が表示されます。この場合も「wb.sheetnames」属性を使うようにしましょう。(後述)
「ワークシート」を操作してみよう_2
続いて、「ワークシート」を取得する方法以外の操作について順に見ていきましょう。
ワークシートの「シート名を変更」する
「シート名」を変更するには「title」属性を使います。
では、先ほどのExcelファイルの一番左のシート名(Sheet)を「new title」に変更します。(7行目)
1 2 3 4 5 6 7 8 9 10 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # 「Sheet」を取得してシート名を「new title」に変更 ws = wb["Sheet"] ws.title = "new title" wb.save('openpyxl_practice.xlsx') wb.close() |
「Sheet」が「new title」に変更されましたね。
ワークシートを「新規作成」する
新規でワークシートを作成する場合は「create_sheet()」メソッドを使います。
引数に「新しく作成するワークシート名」を指定して作成することができますが、何も指定しない場合は「Sheet1」「Sheet2」... のように順番に「番号」が振られて作成されます。
なお、新規でワークシートを作成する場合は必ず一番「右」に作成されます。
では、シート名を「createsheet」と指定して作成してみましょう。(6行目)
1 2 3 4 5 6 7 8 9 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # シート名を指定してワークシートを新規作成する wb.create_sheet("createsheet") wb.save('openpyxl_practice.xlsx') wb.close() |
一番右にワークシートが作成されましたね。
では、一番右ではなく他の場所に作成したい場合はどうしたら良いでしょうか。その場合は、先ほどのシート名の後にインデックス(一番左のシートから「0, 1, 2...」)を入れて場所を指定することができます。
では、「firstsheet」というシート名を一番左(インデックス「0」)に作成してみましょう。(6行目)
1 2 3 4 5 6 7 8 9 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # 一番左にワークシートを新規作成する wb.create_sheet("firstsheet", 0) wb.save('openpyxl_practice.xlsx') wb.close() |
今度は一番左に作成されましたね。
ワークシートを「すべて取得」する
ワークブックからすべてのワークシートを取得するには「sheetnames」属性を使ってリストで取得することができます。
※ 前述したように「get_sheet_names()」メソッドは「非推奨」となっているため、「sheetnames」属性を使いましょう。
では、現時点のワークシート(4つ)をリストで取得してみましょう。
1 2 3 4 5 6 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # すべてのワークシートをリストで取得する print(wb.sheetnames) |
無事4つ分リストで取得できましたね。
今度は、すべてのシートを1つずつ取得(出力)してみたいと思います。
リストから1つずつ取り出すには「for」文でループして取り出せましたね。
1 2 3 4 5 6 7 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # すべてのシートをループして出力する for sheet in wb: print(sheet.title) |
1つずつシート名を取得できましたね。
ワークシートを「コピー」する
ワークシートをコピーするには「copy_worksheet()」メソッドを使って次のように書きます。
()の中は「シート名」ではなく「シートオブジェクト(つまり、「wb["sample"]」のような書き方)」であることに注意しましょう。
では、次の「sample」シートをコピーしてみましょう。
コードはこちら。
1 2 3 4 5 6 7 8 9 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # 「sample」シートをコピー wb.copy_worksheet(wb["sample"]) wb.save('openpyxl_practice.xlsx') wb.close() |
上記を実行すると、一番右に「sample」シートのコピーが作成されましたね。
ワークシートを「コピー」する際は次の点にご注意ください。
① シート内のデータは概ねコピーされるが、一部(画像やグラフなど)はコピーされない。
② ワークブック間でワークシートをコピーできない。
③ ワークブックが「読み取り・書き込み」専用モードの場合はワークシートをコピーできない。
ワークシートを「削除」する
最後にワークシートを削除する2つの方法を見ていきましょう。
先ほどコピーした「sample Copy」シートをそれぞれの方法で削除します。
コードはこちら。どちらかをコメントアウトしてどちらのパターンも試していただければと思います。
1 2 3 4 5 6 7 8 9 10 |
import openpyxl wb = openpyxl.load_workbook('openpyxl_practice.xlsx') # 「sample Copy」シートを削除(下記のどちらか) wb.remove(wb["sample Copy"]) # 1つ目の方法 del wb["sample Copy"] # 2つ目の方法 wb.save('openpyxl_practice.xlsx') wb.close() |
こちらも()の中は「シート名」ではなく「シートオブジェクト(つまり、「wb["sample"]」のような書き方)」であることに注意しましょう。
※ シートを削除する方法として、「remove_sheet()」メソッドがありますが、こちらも「非推奨」となっているため、下記2つのどちらかを使用するようにしましょう。
先ほどの4つのシートの状態に戻れば成功です。
終わりに
以上、「OpenPyXL」のインストールからワークブック、ワークシートの基本操作をお伝えしました。
これで、まずはどの「ワークブック」の、どの「ワークシート」に対して操作するか指定することができました。
次回は、その指定した「ワークシート」の「セル」に対して、値を取得したり値を入力したりしてみたいと思います。

また、その他にも「OpenPyXL」では下記の操作も可能です。
- グラフ
- ピボットテーブル
- 条件付き書式
- 印刷設定 等
大抵のことはできてしまいますね。
「公式サイト(OpenPyXL)」があるので、是非そちらも参考していただければと思います。
と言っても公式サイト慣れしていない方もいると思いますので、また本ブログでも他の操作方法について説明していきたいと思っています。
以上となります。最後まで読んでいただきありがとうございました!