このページの本文へ

仕事に差がつく!阿久津良和「Office 365のスゴ技」 第51回

Excelワークシートを操作するライブラリ「OpenPyXL」

PythonでExcel仕事を自動処理してみよう

2018年10月31日 13時30分更新

文● 阿久津良和 編集 ● 羽野/TECH.ASCII.jp

  • この記事をはてなブックマークに追加
  • 本文印刷

本連載は、マイクロソフトのSaaS型デスクトップ&Webアプリケーション「Office 365」について、仕事の生産性を高める便利機能や新機能、チームコラボレーションを促進する使い方などのTipsを紹介する。

 Office 365を使いこなして仕事を早く終わらせたい皆様にお届けする本連載。今回はPythonを用いたExcelワークシートの自動処理に注目する。

OpenPyXLでワークシートを操作

 プログラミング言語のPythonには、Excelワークシートの操作を可能にするライブラリ「OpenPyXL」が以前から存在する。機械学習の文脈で注目を集めるPythonだが、そのままワークシートを制御できれば便利だろう。すべての手順を紹介しようとすると1回では終わらないため、Pythonのインストールなどは割愛する。なお以下の操作解説ではWindows版Pythonはバージョン3.7.0を用いている。

1.OpenPyXLのインストールは管理者権限を持つコマンドプロンプト上で「pip install openpyxl」を実行する

 まずは簡単なコードを試してみよう。下記のコード(コード1)は、「foo.xlsx」というExcelワークシートファイル名を読み込み、対象となるシート名は「Sheet1」、そしてセルA1の値を標準出力するというものだ。実行すると、セルA1に入力した10月1日という日時が表示される。ちなみに実行時はExcelワークシートを閉じないとパーミッションエラーとなる。コードもUTF-8で記述する必要があるので注意してほしい。


/*
from openpyxl import load_workbook
wb = load_workbook(filename = 'foo.xlsx')
sheet_ranges = wb['Sheet1']
print(sheet_ranges['A1'].value)
*/

2.「foo.xlsx」の内容

3.コード1の実行結果

 さて、上記のコードが正しく動作したら、早速業務利用を考えてみよう。月末になると取引先へ請求書を送ると思うが、規模の小さい企業や個人事業主、副業家などはExcelを用いて作成するケースが少なくない。そこでひな形となる請求書ファイルと、入力すべき内容をまとめた納品一覧ファイルを用意し、請求書を自動生成するコードを考えてみた。ただし、今回は読者諸氏が自身の業務内容に合わせてカスタマイズしやすいように、配列やループなどは使用せず極めてベタなコードにしている。ファイル名やシート名などもお好み合わせて変更してほしい。

 まず用意したのはExcelのテンプレートから適当にピックアップした請求書(bar.xlsx)と納品一覧(list.xlsx)。

4.「こちらは事前に用意した請求書テンプレート

5.同じく事前に用意した納品一覧

 この状態で下記のコード2を実行すると、list.xlsxで指定したセルをメモリー上に読み込み、bar.xlsxファイルへ順次書き込み、最後に別途ファイル(invoice.xlsx)を同じフォルダー内に出力する。


/*
from openpyxl import load_workbook
wb = load_workbook(filename = 'list.xlsx', read_only=True)
ws = wb['Sheet1']
data_PO = ws['B1'].value
data_Day = ws['B2'].value
data_L1_num = ws['B3'].value
data_L1_name = ws['C3'].value
data_L1_value = ws['D3'].value
data_L2_num = ws['B4'].value
data_L2_name = ws['C4'].value
data_L2_value = ws['D4'].value
data_L3_num = ws['B5'].value
data_L3_name = ws['C5'].value
data_L3_value = ws['D5'].value
wb2 = load_workbook(filename = 'bar.xlsx')
ws2 = wb2['請求書']
ws2['F10'].value = data_PO
ws2['L10'].value = data_Day
ws2['B22'].value = data_L1_num
ws2['D22'].value = data_L1_name
ws2['K22'].value = data_L1_value
ws2['B23'].value = data_L2_num
ws2['D23'].value = data_L2_name
ws2['K23'].value = data_L2_value
ws2['B24'].value = data_L3_num
ws2['D24'].value = data_L3_name
ws2['K24'].value = data_L3_value
wb2.save(filename = 'invoice.xlsx')
print("Finish!")
*/

6.コード2の実行結果

 ご覧のとおり請求書は完成したが、企業ロゴが抜けていることにお気付きだろう。画像ファイルの操作はopenpyxl.drawing.imageモジュールを使用するのだが、より完成度を高めるのは別の機会を得てご紹介したい。

■関連サイト

カテゴリートップへ

この連載の記事
ピックアップ