今回も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からダウンロード・インストールすることをオススメする。
Ubuntuでchromium-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