よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

PythonでHTMLの請求書づくり

Pythonとhtmlテンプレートでhtmlの請求書を作ります。

クジラ飛行机さんのマイナビの記事

を改造しました。本記事にあるhtmlファイルをPDFにする部分はやっていません。



作業環境


  • Androidスマホ
  • termux(ターミナルアプリ)
  • Python3.8
  • vim、Jota+(エディタ)
  • 外部ライブラリ

    • Pandas
  • 先に準備するファイル

    • html請求書テンプレート(template.html)
    • 「請求先」「品名」「金額」のCSVファイル(data.csv)



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ファイルがたくさん出来ています。



完成した請求書



f:id:chayarokurokuro:20201230230755j:plain


f:id:chayarokurokuro:20201230230815j:plain

元のテンプレートは、

f:id:chayarokurokuro:20201230231100j:plain
値が置換されている。
一応ちゃんと動いたということで、OKとします。しておきます。

「数量」「単価」「合計」「消費税」「総額」などが入れられるようにテンプレートをイジれば実際に使えそうです。

以前こういうことをExcelのマクロでやっていたが、VBAはデータ量が増えるとPCの動作が重くなり、それで私はPythonに手を出した。
PythonVBAより断然軽いし簡単で良いですね(👍



以上です。

追記
テンプレートエンジンを使う方が楽かも。
【jinja2】テンプレートエンジンでデータの連続差し込み - よちよちpython