【Python初心者】Python×Excel 社内の資料作成の自動化を試みる⑤

Python
ワタシ

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

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

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

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

今回の論点整理

今回のアウトプット

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

イメージは以下の通り。

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

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

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

ツマ

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

今回の位置づけ

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

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

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

【Python初心者】Python×効率化 社内の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初心者のお勉強のお供

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

created by Rinker
¥2,138 (2021/04/11 03:01:22時点 Amazon調べ-詳細)

その他、Python初心者が抑えたいポイント集

Python(主にデータ分析・自動化)に関しては下記のポイントを抑えると実務力につながっていきますので合わせてご参照下さい(‘ω’)ノ

ーPythonのインストール、データ読み込み、各種分析を試すー

【Python入門】WindowsとiPad両方でプログラミング環境を整える

【Python入門】エクセルファイルの読み込み方法

【Python入門】エクセルの”ピボットテーブル”をプログラムする

【Python入門】データ分析の”ビジュアル化”で抑えるべきライブラリとは

【Python入門】回帰分析や分類問題が使えるsklearnの使い方

【Python入門】顧客データを読み込みクラスタリング・ペルソナ分析

【Python入門】画像データを元にディープラーニングで自動判別(CNN等)

【Python入門】WEB上のデータを抽出してテキストマイニング(スクレイピング)

【Python入門】Twitterデータでテキストマイニング(APIの利用)

【Python入門】機械に自動でモデル選定させる(AutoML活用)

【Python入門】iPad×Kaggleで手軽な学習環境を創る

【Python入門】iPad×Google Colabalatoryで手軽にtwitter分析

ーPythonを使ってExcelを扱う “openpyxl”の活用ー

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

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

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

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

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