今年の課題!それはPythonを学ぶこと・・・
新しいプログラム言語を学ぶ際に、何を作れば良いのか?ネタに困って結局、新しい言語を学ぶのをやめてしまう・・・
よくある、あるある話ですね。
一昔前ならHello World!の出力で・・・
どうせなら業務で使えるような内容で勉強したい・・・贅沢な話かもしれませんが・・・
そんな事を考えていると、いつものようにPythonを学ばずに終了です。
そこで、今回はAIを作成・・・
レベルが高いので却下・・・
業務を自動化する(Pythonで自動化流行ってますからね)
これなら、自分のスキルとやる気で十分にやっていけそうです。
で、今回のネタとして、Pythonでエクセルファイルの内容を編集し、PDFファイルを作成するです。
おまけとして、メールに添付して指定したアドレスに自動送信したり、プリンターに印刷したりで遊んで見たいと思います。
エクセルファイルの編集って簡単に行えるの?
PDFファイルの作成は簡単に行えるの?
Pythonってライブラリが豊富に揃っているので、そのへんの機能も用意されているはず・・・
そのあたりも、調べながら楽しんで行こうと思います。
今回は、Pythonとopenpyxlを使って見ました。
■openpyxlのインストール
python3 -m pip install openpyxl
■reportlabのインストール/PDF変換
python3 -m pip install reportlab
openpyxlを使ってエクセルを編集し、reportlabを使ってPDFを作成する情報をよく見かけたので真似して作ってみました。
が・・・
作成されたPDFのレイアウトがめちゃくちゃに壊れています。
エクセルの帳票のイメージで、PDFが作成されるイメージだったのですが・・・
調整が難しい。。。
自分で全て設定しなければならないのはキツイですね。テンプレート化しているシートを使ってサクサクデータを編集、そしてPDFファイルをサクッと作成するだけのイメージだったのですが・・・
もっと簡単にPDFファイルが作成できると思っていたのに・・・
他のライブラリを探すことにしました。
import openpyxl
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
# エクセルを読み込む
wb = openpyxl.load_workbook( 'xxxxx.xlsx' )
# 対象シート名(コピー作成)
target_ws_title = 'test'
# 同じシートを事前に削除する
for ws in wb.worksheets:
if ws.title == target_ws_title:
wb.remove( ws )
# シートをコピーする
ws = wb.copy_worksheet( wb['moto'] )
ws.title = target_ws_title
# エクセルを保存する
wb.save( 'xxxxx.xlsx' )
# エクセルを閉じる
wb.close()
# PDFを作成する
def save_pdf( pdf_file, ws ):
doc = SimpleDocTemplate( pdf_file, pagesize=A4 )
pdfmetrics.registerFont( UnicodeCIDFont( 'xxxxx' ) )
pdf_data = []
# 省略
pdf_data.append( data )
doc.build( pdf_data )
save_pdf( 'xxxxx.pdf', ws )
後、不便に思ったことは
シトーをコピーする際に、同じシート名があるとエラーになることです。上書き指定などのオプションも無さそうなので、事前に同じシートは削除するなどの対応が必要なのでしょうか?また、同名のPDFファイルがある際もエラーになってしまいます。