前回、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幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。