PythonでHTMLの請求書づくり
Pythonとhtmlテンプレートでhtmlの請求書を作ります。
クジラ飛行机さんのマイナビの記事
を改造しました。本記事にあるhtmlファイルをPDFにする部分はやっていません。
作業環境
htmlの請求書テンプレートは上にリンクしたページから拝借しました。
CSVファイルはメモ帳アプリでカンマ区切りで作成。
適当に作業用フォルダを作り、以下の3つのファイルを入れました。
. ├── data.csv ├── make_html.py └── template.html 0 directories, 3 files
make_html.pyは、テンプレートtemplate.htmlとデータの入ったCSVファイルdata.csvからhtmlの請求書を次々に作成するPythonスクリプトファイル。
htmlテンプレート
これは先にフォルダに保存しておきます。
<html><head><meta charset="utf-8"></head><body> <style> h1 { text-align: center; padding: 10px; background-color:navy; color: white; } .right { text-align: right; } .underline { text-decoration: underline; } th { background-color: navy; color: white; padding: 10px;} td { border-bottom: 1px solid navy; padding: 10px; } </style> <p class="right">__DATE__</p> <h1>納品書</h1> <p class="right">(株)▲▲▲▲▲▲</p> <p class="right">Tel: 000-0000-0000</p> <p class="right">Email: test@example.com</p> <h3 class="underline">__NAME__ 様</h3> <p>下記の通り納品いたしました</p> <table width="100%"> <tr><th>品名</th><th>数量</th><th>金額</th></tr> <tr><td>品物</td><td>1</td><td>__PRICE__</td></tr> <tr><td>合計</td><td></td><td>__PRICE__</td></tr> </table> </body></html>
データのCSVファイル
これも先に作ってフォルダに保存しておきます。
田中一郎,卵,120 佐藤二郎,イクラ,450 鈴木三郎,明太子,3800 松本四郎,のりたま,148 山田五郎,玉ねぎ,250 藤本六郎,赤玉ワイン,1000 井上七郎,勾玉,27000 田子八郎,チョコボール,130 工藤九郎,玉櫛,5000 市川十郎,玉三郎,340000000
請求書の作成
請求書htmlファイルを次々に作成するPythonスクリプトです。
import os root = os.path.dirname(__file__) if root=="":root="." template_html = root + '/template.html' # replace date, name, item, price from datetime import datetime date = datetime.now().strftime('%Y年%m月%d日') import pandas as pd df = pd.read_csv("data.csv", encoding='utf-8', header=None, names=["name","item","price"]) for i in range(df.shape[0]): # read template with open(template_html, "rt", encoding='utf-8') as f: text = f.read() No = str(i + 1) name = df.iloc[i]["name"] item = df.iloc[i]["item"] price = df.iloc[i]["price"] text = text.replace("__NAME__", name) text = text.replace("品物", item) text = text.replace("__PRICE__", str(price)) text = text.replace('__DATE__', date) # prefile temp_file = root + '/No{}_{}_{}.html'.format(No,name,date) with open(temp_file, "wt", encoding="utf-8") as f: f.write(text)
もっとマシな書き方があるでしょうけど、スマホでチマチマやっていると全然上達しません(笑)
実行
上で作ったpyファイルをターミナルで実行します。
作業フォルダ内にhtml請求書ファイルがデータの行数分だけ作られます。
$ python make_html.py
実行後のフォルダ内
. ├── No10_市川十郎_2020年12月30日.html ├── No1_田中一郎_2020年12月30日.html ├── No2_佐藤二郎_2020年12月30日.html ├── No3_鈴木三郎_2020年12月30日.html ├── No4_松本四郎_2020年12月30日.html ├── No5_山田五郎_2020年12月30日.html ├── No6_藤本六郎_2020年12月30日.html ├── No7_井上七郎_2020年12月30日.html ├── No8_田子八郎_2020年12月30日.html ├── No9_工藤九郎_2020年12月30日.html ├── data.csv ├── make_html.py └── template.html 0 directories, 13 files
変なhtmlファイルがたくさん出来ています。
完成した請求書
元のテンプレートは、
値が置換されている。
一応ちゃんと動いたということで、OKとします。しておきます。
「数量」「単価」「合計」「消費税」「総額」などが入れられるようにテンプレートをイジれば実際に使えそうです。
以前こういうことをExcelのマクロでやっていたが、VBAはデータ量が増えるとPCの動作が重くなり、それで私はPythonに手を出した。
PythonはVBAより断然軽いし簡単で良いですね(👍
以上です。
追記
テンプレートエンジンを使う方が楽かも。
【jinja2】テンプレートエンジンでデータの連続差し込み - よちよちpython