仕事に差がつく!阿久津良和「Office 365のスゴ技」 第51回
Excelワークシートを操作するライブラリ「OpenPyXL」
PythonでExcel仕事を自動処理してみよう
2018年10月31日 13時30分更新
本連載は、マイクロソフトのSaaS型デスクトップ&Webアプリケーション「Office 365」について、仕事の生産性を高める便利機能や新機能、チームコラボレーションを促進する使い方などのTipsを紹介する。
Office 365を使いこなして仕事を早く終わらせたい皆様にお届けする本連載。今回はPythonを用いたExcelワークシートの自動処理に注目する。
OpenPyXLでワークシートを操作
プログラミング言語のPythonには、Excelワークシートの操作を可能にするライブラリ「OpenPyXL」が以前から存在する。機械学習の文脈で注目を集めるPythonだが、そのままワークシートを制御できれば便利だろう。すべての手順を紹介しようとすると1回では終わらないため、Pythonのインストールなどは割愛する。なお以下の操作解説ではWindows版Pythonはバージョン3.7.0を用いている。
まずは簡単なコードを試してみよう。下記のコード(コード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)
*/
さて、上記のコードが正しく動作したら、早速業務利用を考えてみよう。月末になると取引先へ請求書を送ると思うが、規模の小さい企業や個人事業主、副業家などはExcelを用いて作成するケースが少なくない。そこでひな形となる請求書ファイルと、入力すべき内容をまとめた納品一覧ファイルを用意し、請求書を自動生成するコードを考えてみた。ただし、今回は読者諸氏が自身の業務内容に合わせてカスタマイズしやすいように、配列やループなどは使用せず極めてベタなコードにしている。ファイル名やシート名などもお好み合わせて変更してほしい。
まず用意したのはExcelのテンプレートから適当にピックアップした請求書(bar.xlsx)と納品一覧(list.xlsx)。
この状態で下記のコード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!")
*/
ご覧のとおり請求書は完成したが、企業ロゴが抜けていることにお気付きだろう。画像ファイルの操作はopenpyxl.drawing.imageモジュールを使用するのだが、より完成度を高めるのは別の機会を得てご紹介したい。
この連載の記事
-
第100回
Team Leaders
Office 365の更新チャネル名が“また”変更へ -
第99回
Team Leaders
今さら聞けないMicrosoft Teamsの便利な機能 -
第98回
Team Leaders
進化するMicrosoft Teams――2020年4月に追加された新機能を紹介 -
第97回
Team Leaders
SlackからTeamsを呼び出すアドオン、Teamsのカスタム背景画像を試す -
第96回
Team Leaders
WSLでWord文書ファイルをテキスト化する -
第95回
Team Leaders
中堅中小企業向けOffice 365もMicrosoft 365へ -
第94回
Team Leaders
共有メールボックスでOutlookのメール容量を2倍に -
第93回
Team Leaders
見送られたMicrosoft SearchでのBingの強制利用 -
第92回
Team Leaders
外部との仕事がはかどるOneDrive for Businessの「ファイル要求」 -
第91回
Team Leaders
Office 365でシンプルなタイトルバーを復活させる -
第90回
Team Leaders
Excelの新自動化ソリューション「Office Scripts」プレビュー版が登場 - この連載の一覧へ