前回、PythonからExcelファイルを操作する方法を紹介した。そこで、今回は、既存の請求書や領収書のフォーマットにデータを自動入力する方法を紹介しよう。今では大抵の仕事においてExcelで書類を作成する作業が発生する。Pythonを使って作業時間の短縮に挑戦しよう。

  • 今回作成する請求書自動入力プログラム

    今回作成する請求書自動入力プログラム

今回作るプログラムについて

そこで、このライブラリを利用して、請求書と納品書の二つのExcelファイルを自動的に生成するプログラムを作ってみよう。

具体的には、以下の手順で処理を自動化してみよう。

(1) Excelで請求書と納品書のテンプレートファイルを作成する
(2) 金額や個数などを記した納品物一覧ファイルを作る
(3) 納品物一覧ファイルを読み込んで、請求書と納品書のExcelに差し込んで新規保存する

なお、プログラムおよび、Excelのテンプレートファイル一式は、こちらからダウンロードできる。

まずはExcelで請求書と納品書のテンプレートを作ろう

それでは、最初にテンプレートを作成しよう。ここで作るのは、請求書(invoice.xlsx)と納品書(delivery_slip.xlsx)だ。とりあえず、以下のような一般的なものを準備してみた。最近では、会社の持ち味を反映した個性的な請求書・納品書も増えているので、これを叩き台にExcelを駆使してオリジナルテンプレートを作ることもできだろう。

  • 請求書のテンプレートと納品書のテンプレート
  • 請求書のテンプレートと納品書のテンプレート
  • 請求書のテンプレートと納品書のテンプレート

納品物の一覧を作成しよう

次に、納品物の一覧表を「list.xlsx」という名前で作成しよう。今回の請求書・納品書では、8行のスペースしか用意しなかったので、それに収まるように適当にデータを入力してみよう。

  • 納品物の一覧データを作成したExcelファイル

    納品物の一覧データを作成したExcelファイル

プログラムを作ろう

テンプレートと、テンプレートに流し込むデータを用意したら、いよいよデータをテンプレートに流し込むPythonのプログラムを作ってみよう。なお、PythonからExcelファイルを操作するライブラリ『openpyxl』は前回の内容を参考にインストールしたものとする。

そして、以下のプログラムを「gen_invoice.py」という名前で保存しよう。

import openpyxl, pprint
from datetime import datetime

# ファイル名の指定など --- (*1)
file_list = "list.xlsx" # 納品物一覧
file_invoice= "invoice.xlsx" # 請求書のテンプレート
file_delivery = "delivery_slip.xlsx" # 納品書のテンプレート
file_out_iv = "out-invoice.xlsx" # 生成する請求書
file_out_ds = "out-delivery_slip.xlsx" # 生成する納品書

# 納品物一覧を読み込む --- (*2)
wb = openpyxl.load_workbook(file_list, data_only=True) # 数式でなく値を取り出す場合
ws = wb["sheet1"] # sheet1を選ぶ
name = ws["A1"].value # 宛名を得る
list_data = ws["A3:F10"] # 任意の範囲を取得

# 請求書と領収書のテンプレートを読む --- (*3)
wb_iv = openpyxl.load_workbook(file_invoice)
ws_iv = wb_iv.active
wb_ds = openpyxl.load_workbook(file_delivery)
ws_ds = wb_ds.active

# 宛名と日付を書き込む --- (*4)
cdate = datetime.now().strftime("%Y/%m/%d")
ws_iv["A3"].value = name
ws_iv["F2"].value = cdate
ws_ds["A3"].value = name
ws_ds["F2"].value = cdate

# 納品物を書き込む --- (*5)
for y, row in enumerate(list_data):
  for x, cell in enumerate(row):
    if (cell is None) or (cell.value is None): continue
    v = cell.value
    ws_iv.cell(row=12+y+1, column=0+x+1, value=v)
    ws_ds.cell(row=12+y+1, column=0+x+1, value=v)

# 新しく保存する --- (*6)
wb_iv.save(file_out_iv)
wb_ds.save(file_out_ds)
print("ok")

プログラムを実行するには、コマンドラインから以下のように入力して[Enter]キーを押そう。

# Windows
python gen_invoice.py




# macOS
python3 gen_invoice.py

すると、テンプレートに納品物一覧(list.xlsx)に指定したデータが流し込まれて、「out-invoice.xlsx」と「out-delivery_slip.xlsx」に保存される。宛名、日付、納品物一覧が書き換わっていることを確認しよう。

  • しっかりとテンプレートにデータが流し込まれた

    しっかりとテンプレートにデータが流し込まれた

それでは、プログラムを確認してみよう。プログラムの(*1)の部分では、ファイル名を指定している。プログラムの設定などは、このようにプログラム冒頭にまとめて書いておくのが鉄則だ。

(*2)の部分では、納品物一覧のExcelファイルを読み込んでいる。ファイルを読み込む際、data_only=Trueというオプションを指定すると、セルに数式が入っていた場合、数式ではなく計算結果が取得できるようになるので便利だ。そして、ws["A1"].valueのようにセル名を指定して値を取得できる。ws["A3:F10"]のようにして、複数セル範囲を取得することも可能だ。

(*3)ではテンプレートファイルを読み込む。(*4)では宛名と日付の部分を書き換える。日付は、プログラムを実行した日を挿入する。そして、(*5)の部分では、納品物の一覧データをfor構文を使って一つずつ書き込む。最後に、(*6)の部分で、Excelファイルを保存する。

ワークブックの読み込みと保存

それでは、簡単にopenpyxlの使い方をまとめてみよう。ライブラリを利用するには、import文を以下のように使う。

# ライブラリの取り込み
import openpyxl

そして、Excelのブックを読み込むには、下記のように、load_workbook()を使い、保存には、wb.save()を使う。

# ワークブックの読み込み
wb = openpyxl.load_workbook("ファイル名.xlsx")

# ワークブックの保存
wb.save("保存ファイル名.xlsx")

セルの読み取りと値の設定

セルの値を操作する前に、ワークブックのオブジェクトから、ワークシートのオブジェクトを取得する必要がある。

# シート名を指定してワークシートを得る
sheet = wb["シート名"]

# アクティブになっているワークシートを得る
sheet = wb.active

そして、ワークシートのオブジェクトが得られたら、セル名を指定して値を取得・設定できる。

# A1のセルに「こんにちは」と設定
sheet["A1"].value = "こんにちは"

# A1のセルの値を表示する
print( sheet["A1"].value )

この時、セルの位置を数値で指定することもできる。引数に与えるパラメータだが、行がrow、列がcolumn、設定する値がvalueだ。

# A1のセルに値を設定
sheet.cell(row=1, column=1, value="こんにちは")

今回紹介したプログラムで使ったのは、これだけなので、それほど難しいことはないだろう。 なお、openpyxlライブラリのマニュアルが以下に用意されている。これを見れば、スタイルなども操作できることが分かる。

openpyxl Docs
[URL] https://openpyxl.readthedocs.io

まとめ

以上、今回は、よくある請求書と納品書のExcelファイルを自動生成するプログラムを紹介した。大半の作業が電子化されていたとしても、大なり小なり、請求書や領収書の作成作業が生じるのは仕方がない。そこで、毎月決まり切った処理は、できるだけ自動化するなら、作業時間を短縮するだけでなく、心理的ストレスも少なくなるだろう。決まり切った処理ばかりで、それほど難しい部分はないので自動化に挑戦してみよう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。