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