【Python自動化】読み込んだデータをword/PDFにして保存する方法

Python・GAS・DS
ワタシ

今回は社内でのエクセル業務の自動化について理解を深めます。

Pythonを使うと、Excel仕事を効率化・自動化することが可能です。

では具体的にどうやるのか?Pythonかじりはじめたばかりでもできるのか?実務で使えるのか?

この点を明らかにするべく、営業上がり・非エンジニアの私でも出来るレベルの効率化ワザをまとめます(‘◇’)ゞ

合わせて確認したい記事

Pythonを時短で基礎から応用まで一気に学びたい時はこちらもオススメ!
>>【Python】TechAcademyを実際に使ってみて学べたこと

今回の論点整理

今回のアウトプット

今回は編集したデータを共有しやすい形に加工することを目的にします。

イメージは以下の通り。

ワードやPDFなど、共有する際はエクセルの形でない方が好ましいケースが多いです。

Pythonを介すればここの変換や共有についてもコードが用意されているのでここも一度用意してしまえば再利用が容易です。

尚、今回も参考にしているのは以下の書籍で、実践に活用しようと思います。ポイントを絞ってかなり詳しく記載しておりオススメです。

ツマ

参考書があると目的に対して勉強の流れが明確になるね。

今回の位置づけ

現業におけるデータ分析・エクセル業務を考えると、ザックリ以下の6ステップを踏んでいます。

そのため、今回もこの6ステップの流れを踏まえて、どこを効率化・自動化するかを絞って進めます。

そもそも現業の何の自動化をめざすのか?という点については下記に記載しています。

【Python自動化】openpyxlを使って 社内のExcel作業を自動化する

その上で、今回はデータは何らかの形で抽出されている前提で、そのデータをいじる工程であるSTEP4を対象にします。

上記を実現する手順について下記に備忘録的にまとめたいと思います。

今回のポイントは以下の3点になります。

抑えドコ!
  • PDFに置き換える
  • Wordに入れ込む
  • 好きなフォルダに格納

順に触れていきます。

Excel業務の自動化に向けたポイント

PDFに置き換える

まずは今回複数のライブラリをインストールします。

import openpyxl 
import sys
import datetime

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

ここでPDFに出力する関数を使います。長くなるので3つに分解します。

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)
    pdfmetrics.registerFont(TTFont("GenShinGothic-Normal","GenShinGothic-Normal.ttf"))

最後の1行はフォントの設定になります。.ttfの部分を変えればフォントは変更されます。

ちなみに、このフォントは下記のサイトでダウンロードできます。

■参考リンク(外部リンクに飛びます)

PDF化コード②

    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)

これは前回もやった通り、日付や金額のセルの設定になります。

売上金額だったら金額に適したセルフォーマット、日付であったら日付に適したセルフォーマットにします。

ここは、この書式が入る際のおまじないくらいに思ってやればいいのかなと思います。

PDF化コード③

  table.setStyle(TableStyle([ 
        ('BACKGROUND',(0,0),(-1,0),colors.lightgreen), #1行目セル背景色変更
      ("ALIGN", (0,0),(-1,0), "CENTER"), #1行目中央寄せ
        ("ALIGN", (0,1), (0,-1), "RIGHT"), #1列目右寄せ
        ("ALIGN", (2,1), (2,-1), "RIGHT"), #3列目右寄せに
        ('TEXTCOLOR',(0,0),(1,-1),colors.black), #1,2列目文字色変更
        ('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()

最後がレイアウトです。

上から順に『背景変更、文字寄せ、文字色変更、フォント変更、罫線設定』の5つを設定しています。

ここは必要に応じて設定する必要があります。

基本的に(○,○),(●,●)の形をとっていますが、(開始するセル)、(終了するセル)の指定して選択といった意味合いです。

また、-1というのは”最後”という意味になるので(0,0), (-1,0)というのは一番左上のセルから、一番左下までのセルを選択するという意味合いになります。

これでPDF化の関数が定義出来ました。

あとは下記のようにその関数を使って出力するだけです。

#ファイル出力
excelToPdf("読み込むエクセルファイル.xlsx","出力するPDFファイル.pdf")
ワタシ

機能ごとに関数の定義をマルッとまとめておけば再利用が楽です

Wordに差し込む

エクセルファイルの一部をワードファイルにいれこんで出力します。

仕事をしていると、資料作成時に『一部を除きほとんど同じ型で複数出力する』という機会も多くあります。

例えば、領収書の宛名を指定人数分を同じ型で作ったり、年賀状を同じ型で指定の宛先で宛名だけ変えて出力するみたいなものです。

今回はそういった差し込み出力を想定します。コードは以下の通り。

#Excel のデータを Word に書き出す
import os
import sys
import pandas as pd #pandasをインポート 
from docx import Document

#ディレクトリ参照しファイルを開く
path = os.getcwd()
try:
    df = pd.read_excel("領収書(原本).xlsx")
except FileNotFoundError:
    print("ファイル読み込みエラー")
    sys.exit()
columns = list(df.columns) 

※上記のDocumentなどは普段あまり使わないライブラリだと思うので最初にやる時は pipでインストールすることをお忘れなく。

その後にエクセル内のデータを参照して条件を入れ込みます。for文で繰り返し処理を行い、出力の実行を複数回をおこないます。

#繰り返し差し込み出力
for index,item in df.iterrows(): 
    try:
        document = Document("原本.docx")
    except FileNotFoundError: 
        print("ファイルが見つかりません")
        sys.exit()
    for par in document.paragraphs: 
        for column in columns: 
            if str(column) in par.text: #段落に置換対象が含まれているかどうか判定
                if str(column) == "$日付": #日付の場合の形式の設定
                    item[column] = str(item[column]. year)+"年"+str(item[column].month)+"月"+str(item[column].day)+"日"
                if str(column) == "$金額": #金額の場合の形式の設定
                    item[column] = "¥{:,d}".format(item[column]) 
                par.text = par.text.replace(str(column),str (item[column]))
    outFile = os.path.join(path,"OutFolder",item["$お名前"]+"様領収書.docx")
    try:
        document.save(outFile) #Wordのファイルに書き出し 
    except FileNotFoundError:
        print("保存先のフォルダがありません")
        sys.exit()

上記を通じて、原本というwordファイルを読み込み、その中にエクセルの一部データを追加してフォルダ(OutFolder)に格納しています。

ツマ

年末の年賀状処理とかもこれで出来ると楽そうだね

好きな場所に保存

そして最後に管理・共有がしやすいように指定ディレクトリに保存します。

今回は指定のフォルダ(OriginalFolede)内のエクセルファイルを参照して、

保存したいフォルダ(SaveFoleder)を別に指定してPDF化(①で作った関数)したものを保存します。

まずは作業中のディレクトリ内に上記フォルダを作った上で、下記のようにファイル格納先を参照します。

#現在の作業フォルダ位置から指定フォルダを参照
path = os.getcwd() 
excelFilePath = os.path.join(path,"OriginalFolede") 

次に、フォルダ内でエクセルファイル(.xlsxがファイル名につくもの)を参照します。

#ファイル一覧を取得しつつ、ファイル名から.xlsxを抜く
files = os.listdir(excelFilePath) 
for f in files:
    if ".xlsx" in f:
        work = f.strip(".xlsx") 

それぞれのエクセルファイルに対応したpdfの名前を作り、最後に①で作ったexcelToPDFの関数に適応します。

#元のファイル名.pdfの名前にしてexcelToPDFの関数を利用
excelFile = os.path.join(excelFilePath,f)
pdfFile = os.path.join(path,"出力データ",work+".pdf") 
excelToPdf(excelFile,pdfFile)

これで無事、自分で入れたい場所にファイルを保存することが出来ました。

ワタシ

一度やってしまえばあとは簡単に出来そうですね

まとめ 

上記を活用する際に、理解しておくべきポイントは以下3点でした。

今回の抑えドコ
  • PDFに置き換える
    SimpleDocTemplateを使い条件を設定してPDF化
  • Wordに差し込む
    ▷Documentのdocxを使いWord化
  • 好きなフォルダに格納
    os.path.joinを使いディレクトリを指定して保存

これでエクセルだけでなくWordやPDFへの変換やPC内での保存などの基本操作ができました。

詳しくは下記書籍を見ればもっとわかりやすく、上記の関数をググるだけでもかなりの数解説サイトがヒットするので調べながらやるのをオススメします。

ここまででエクセルで出来る自動化の骨子はそろったので、これらを組み合わせてどんなことが出来ると良いかを妄想しながら、どんどんプチ自動化を実践することで飛躍的に生産性があがります\(^o^)/

ご精読頂きありがとうございました!
m(_ _)m

【参考】Python初心者のお勉強のお供

▼PythonでExcelの操作を自動化する▼

【関連】Python×効率化 社内のexcel作業の自動化を試みる①

【関連】Python×効率化 社内のexcel作業の自動化を試みる②

【関連】Python×効率化 社内のexcel作業の自動化を試みる③

【関連】Python×効率化 社内のexcel作業の自動化を試みる④

【関連】Python×効率化 社内のexcel作業の自動化を試みる⑤

上記の内容と併せて実務で活かすという視点では下記の参考図書も合わせて確認すると理解が深まります(-_-)

▼オススメの参考書籍(Kindle)▼

created by Rinker
¥2,138 (2024/04/26 07:07:19時点 Amazon調べ-詳細)

▼おすすめの動画学習(Udemy)

>>ゼロからPythonで学ぶ人工知能と機械学習 【2023年最新版】

>>現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用

>>独学で身につけるPython〜基礎編〜【業務効率化・自動化】

【参考】Python初心者が抑えたいポイント集

Python(主にデータ分析・自動化)に関しては

下記に実践したポイントをまとめています。基本的にコピペするだけでそのまま使えます٩( ᐛ )و

【Python入門】コピペしてそのまま使えるPythonの自動化プログラムまとめ

業務効率化・自動化においてはGoogle Apps Scriptもセットで学ぶことをオススメ!

こちらもコピペしてすぐに使えます!

【GAS入門】コピペしてそのまま使えるGoogle Apps Scriptプログラム一覧

PythonとGoogle Apps Scriptどちらを深めようかを迷っていればこちら!

【徹底比較】PythonとGASをどちらを学ぶべきか?実際に両方を学んで分かった違いとオススメ学習法