システム開発・構築の神様

新しいサービスや技術を使った開発や構築。その他不具合解決など

Pythonとopenpyxlでエクセルを編集しPDFファイルを作成する

今年の課題!それは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ファイルがある際もエラーになってしまいます。

関連記事