見出し画像

11月19日 Python学習日記 1日1プログラム! Excel自動化 22.ExcelをPDFに変換する

こんばんは。

プログラミングを学び始めて4カ月のかおりです。

今日は、伊沢 剛先生の

22.ExcelをPDFに変換する」を実践します💪 

※プログラムコードは伊沢 剛先生の著書 めんどうな作業が秒速で終わる! Excel×Python自動化の超基本 を使用しております。

内容  :ExcelのブックをPDFに出力するプログラム

ポイント:

・そもそもPDF化するメリットは2つあります。

・1つ目は、Excelを扱う環境がPCによって異なるため。自分のExcelでの見え方と他人のExcelでの見え方が違ってしまうことを防ぎます。特に画面上と印刷時のセルのサイズはズレが生じやすいので、PDF化でデータの表示環境を固定します。

・2つ目は、データを変更できないようにするセキュリティ上の問題で、金額の入る資料などでは特に重要です。

・ファイルをいくつも作る場合、Excelで作ったデータをいちいちPDF化する作業の手間も馬鹿になりません。

・新しいライブラリ「reportlab」をインストールする必要があります。目

・コマンドプロンプトより、「pip install reportlab」と入力し、エンターを押し、インストールします。※Macの場合、「(sudo) pip3 install reportlab」(sudo)はなくても問題ないこともあります。

・フォントのダウンロードも必要なので http://jikasei.me/font/genshin/ よりzip形式でダウンロードをクリックしてダウンロードします。

・まず、プログラムを修正させる命令sys、日付を扱うのでdatetaime、Excelの書式の設定なのでopenpyxlの3つをインポートします。

import sys #プログラムを終了させるときの命令が入っているのでsysをインポート
import datetime 
import openpyxl #openpyxlをインポート 

・次に、reportlab 紙の設定やフォントの設定に使うライブラリ

from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.platypus import SimpleDocTemplate,Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors

・excelToPdf という関数にしている、Excelのファイルを指定して、PDFの出力ファイルを指定することによってファイルが出力されるっていう関数でひとまとまりの処理にしています。

・try: except は「例外処理」開こうとするフォルダがなかったりするとtryの中にあるデータを確認していって、もし、例外が発生したらexceptのところに行きます。FileNotFoundError:が出たら、エラーを出すよ。という意味。ファイルが無ければファイルが見つかりませんという画面に出力して、プログラムを修了するようになります。

・document = の行でPDF文章を作成している。PDFを出力するのはどんな感じかというと、セルを1つずつ読んでいって、ワープロ感覚で書いていくようなイメージです。

・elements = [] 文章の部品みたいなもので、この中にテーブル(表)を入れていくようになります。
・tableData = [] これは、テーブルデータを入れるためのリスト

次から、ループに入って、

・recordList = [] 列をひとまとまりにするrecordListというリストを用意します。ここにデータが入っていきます。

・最初のif文は、列が。売上金額の場合、¥がついた数値形式の書式にします。

・次のif文は、列が日付の時は、2020-8-1という感じで、ー(ハイフン)区切りで書式を整える。ということをしていきます。

・table.setStyleは書式の設定になります。

・("ALIGN", (0,0),(-1,0), "CENTER"),  #行見出しを中央寄せにする は、  左側の0が列番号、右側の0が行番号になります。左側の( )が開始セルで、右側の()が終了セルになります。これは、0列、0行という意味なので、A1を見てる。-1というのは、最後の列、つまりデータがあるところまで見ますよということ。

※0は1行目を見てる。プログラムの世界は数値は0からスタートが基本!

・("ALIGN", (0,1), (0,-1), "RIGHT"), #日付の列を右寄せにする だと、1行目の0列目、A2から、-1なので、データがあるところまで右寄せにしますよ。ということ。

・document.buildも例外処理(try: except)で囲ってる。

・最後のexcelToPdfは、売上リスト(pg22_01用).xlsxを読み込み元として、売上リストPDF.pdfを出力するよという風に呼び出しをしています。

def excelToPdf(excelFile,pdfFile):
   try:
       workBook = openpyxl.load_workbook(excelFile) #エクセルブックを開く
   except FileNotFoundError:
       print("ファイルが見つかりません")
       sys.exit()
   sheet = workBook.active #アクティブなワークシートを選択
   document = SimpleDocTemplate(pdfFile, pagesize=A4)
   #フリーフォント源真ゴシックを利用(http://jikasei.me/font/genshin/からダウンロード)
   pdfmetrics.registerFont(TTFont("GenShinGothic-Normal","GenShinGothic-Normal.ttf"))
   elements = []
   tableData = []
   for row in sheet.rows:#行ループ
       recordList = []
       for cell in row: #列ループ
           if sheet.cell(row = 1, column = cell.column). value == '売上金額' and cell.row != 1: #もしも列が売上金額のとき
               cell.value = "¥{:,d}".format(cell.value)
           if sheet.cell(row = 1, column = cell.column). value == '日付' and cell.row != 1: #もしも列が日付のとき
               cell.value = str(cell.value.year)+"-"+str(cell.value.month)+"-"+str(cell.value.day)
           recordList.append(cell.value)
       tableData.append(recordList)
   table=Table(tableData)
   table.setStyle(TableStyle([ #属性値、開始位置、終了位置、属性
       ("ALIGN", (0,0),(-1,0), "CENTER"), #行見出しを中央寄せにする
       ('BACKGROUND',(0,0),(-1,0),colors.lightgreen), #行見出しをライトグリーンにする
       ("ALIGN", (0,1), (0,-1), "RIGHT"), #日付の列を右寄せにする
       ("ALIGN", (2,1), (2,-1), "RIGHT"), #売上金額の列を右寄せにする
       ('TEXTCOLOR',(0,0),(1,-1),colors.black), #文字色を黒にする
       ('FONT', (0, 0), (-1, -1), "GenShinGothic-Normal", 20), #フォントとフォントサイズを設定
       ('GRID', (0, 0), (-1, -1), 0.5, colors.black),])) #ケイ線の設定
   elements.append(table) 
   try:
       document.build(elements)  #PDFの書き出し    except FileNotFoundError:
       print("出力用のフォルダがありません")
       sys.exit()
excelToPdf("売上リスト(pg22_01用).xlsx","売上リストPDF.pdf")      

実行結果:

画像1


Pythonのメリットの一つに、動くプログラムを実際に体験するまでのスピードが速いことが挙げられると思います。プログラミング学習のモチベーションが高まりますよ!プログラミング初心者の方にはぜひ、PythonでのExcel作業の自動化から体験してみて欲しいです!!

本日のエラー : なし

本日もおつかれさまでした(^^♪ 

最後までお読み頂きありがとうございました!時間は有限です。ほんのちょっとでもあなたの背中を押せるお手伝いができていたら嬉しいです。「スキ」ボタンを励みに、もっとあなたを応援できるように頑張ります💛