adbird(広告鳥) 備忘録

エクセル(.xlsx)の任意のセルから値を抽出し、htmlに挿入する。さらにPDF変換。

今回もChatGPTさんに大変、お世話になった…。

pythonインストール

Windowsの場合、Microsoft Store から python(3.11で動作確認) をインストール。

openpyxl パッケージ

openpyxl パッケージを使用するので、それをインストールするために、
まずPythonの標準パッケージ管理システムであるpipをインストールして、
その後、pipを使って、openpyxl パッケージをインストール。

Windowsの場合、Microsoft Store からインストールした時点ですでにpipは入っているはずなので、2行目だけ実行。

$ sudo apt install python3-pip
$ pip install openpyxl

PDF変換のためのツールをインストール

後述のスクリプトではwkhtmltopdfの方を有効にしている。

wkhtmltopdfを使う場合

Windowsの場合

1) インストール

ターミナル(コマンドプロンプトWindows PowerShellなど) を立ち上げて

winget install wkhtmltopdf

を実行してインストール。

2) wkhtmltopdf への pathを通す

おそらく C:\Program Files\wkhtmltopdf\bin の中に、「wkhtmltopdf.exe」がインストールされたはずなので、

Windowsの「設定」で

  • 環境変数を編集」を検索して出てきたら、それクリック。
  • 「Path」を選び「編集」をクリック。
  • 「新規」をクリック。
  • 「参照」でパスを通したいプログラム(wkhtmltopdf.exe)が入っているフォルダ「C:\Program Files\wkhtmltopdf\bin」(exeファイルではないので注意)を追加。

Ubuntuの場合

aptでインストールしたものはオプションが効かない場合があるので、公式サイトwkhtmltopdfからダウンロード・インストールすることをオススメする。

Ubuntuchromium-browserを使う場合

$ sudo apt install chromium-browser

pythonスクリプト

ディレクトリ(フォルダ)内に sample.xlsx があり、そのエクセルからC1とB2のセルの内容を抽出して、htmlに挿入する。

以下をsample.xlsxと同じディレクトリ内に xlsxtopdf.py として保存。

import openpyxl
import sys
import subprocess

# Excelファイルを開く
wb = openpyxl.load_workbook(f'{sys.argv[1]}.xlsx')
sheet = wb['Sheet1']

# シート全体のセルに対して、改行を<br>に置換する
for row in sheet.iter_rows():
    for cell in row:
        if cell.value is not None and isinstance(cell.value, str):
            cell.value = cell.value.replace('\n', '<br>')

# セルの値を読み取る
# セルの値を取得
C1 = sheet['C1'].value
B2 = sheet['B2'].value

# HTMLの作成
html = f"""
<html>
<body>
<head>
<meta charset="utf-8">
</head>
<table>
<tr><td>見出し1</td><td>{C1}</td></tr>
<tr><td>見出し2</td><td>{B2}</td></tr>
</table>
</body>
</html>
"""

# HTMLのファイルへの書き込み
with open(f'{sys.argv[1]}.html', 'w') as f:
    f.write(html)

#PDF変換

#chromium-browserを使う場合
#input_file = f"{sys.argv[1]}.html"
#output_file=f"{sys.argv[1]}.pdf"
#command = ["chromium-browser", "--headless","--print-to-pdf="+output_file, input_file]
#subprocess.run(command)

#wkhtmltopdf  0.12.6 (with patched qt)を使う場合。 バージョンによって上手くいかなくなることがあるので注意。
input_file = f"{sys.argv[1]}.html"
output_file=f"{sys.argv[1]}.pdf"
options = [
    "--enable-local-file-access",
    "--disable-smart-shrinking",
    "--margin-top", "18",
    "--margin-left", "18",
    "--margin-right", "18",
    "--margin-bottom", "18",
    "--footer-font-size", "9",
    "--footer-center", "[page]" ]
command = ["wkhtmltopdf"] + options + [input_file, output_file]
subprocess.run(command)

端末で、次を実行(拡張子xlsxは入力しない)。htmlファイルとpdfファイルが生成されているはず。

$ python3 xlsxtoodf.py sample

Windowsではコマンドは「python3」ではなく、「python」。