【Pythonで業務効率化】依頼:このフォルダにあるExcelぜんぶPDFにしてね。


はじめに

こんな事がありました。
先輩「フォルダにある130件のExcelファイル、〇〇ってシート名に書いてるシートだけPDFにしてほしいんだよね。よろしく!」
僕「分かりました。なるはやでやります!」
作業・・・・
僕「できました!」
先輩「おー、ありがとう。助かった!」
僕「ふう、疲れたあ。。。」
Python「え。私でExcelファイルをPDFにできるの知らないの?」
僕「まじか。また今後もこういう作業あるから、今度は効率化できるように調べてみるか!」

ということで、備忘録も兼ねて、フォルダにあるたくさんのExcelファイルをPDFにしておくコードの解説をしていきたいと思います。

ExcelファイルをPDFにしよう

Excelを操作する為に、win32comというモジュールを使います。
このモジュールをインストールした事が無い場合は、pipでインストールをします。

pip install pywin32

まず初めに、1つのExcelファイルの1つめのシートをPDFに変換するプログラムを書いてみました。

code.py
import win32com.client 
excel = win32com.client.Dispatch("Excel.Application")
file = excel.Workbooks.Open(r"C:\aa\bb.xlsx")
file.WorkSheets(1).Select()
file.ActiveSheet.ExportAsFixedFormat(0,r"C:\aa\bb")
file.Close()

1行目は、win32comのインポート
2行目は、Excelを操作しますよーっていう設定
3行目は、PDFにしたいExcelファイルの絶対パス
※'r'を使うことで、raw文字列として扱っています。
4行目は、シートのインデックスを指定(この場合は、1つ目のシート)
※シート名で指定する時は、"シート名"とします。複数シートを選択したい場合は、リストを使って指定します。
5行目は、このフォルダにExcelと同じ名前でPDFにしてーって書いています。第一引数を0にする事で、PDFに変換してねってお願いしています。
6行目でopenしたファイルをcloseします。これをしないと、Excelが読取り専用のままになってしまいます。

フォルダのExcel全てをPDFに

次に、フォルダのExcel全てをPDFにするプログラムを書いていきたいと思います。

まずフォルダを指定し、そのフォルダにある全ファイル名を拡張子含めてリストに格納しました。
そして、そのファイルを1つずつPDFに変換していきます。うまく変換できなかった場合でも、ファイルをきちんと閉じるように、例外処理を使ってファイルを閉じるようにしました。
Excel名をPDF名にできるように、splitext()を使って、ファイル名と拡張子名を分けてから、ExportAsFixedFormat()の引数に渡しました。

code.py
import win32com.client 
import os

excel = win32com.client.Dispatch("Excel.Application")

path = 'C:/aa/'
files = []

for filename in os.listdir(path):
    if os.path.isfile(os.path.join(path, filename)):
        files.append(filename)

for i in range(0,len(files)):
  try:
    file = excel.Workbooks.Open(path + '/' + files[i])
    file.WorkSheets("AA").Select()
    name, ext = os.path.splitext(files[i])
    file.ActiveSheet.ExportAsFixedFormat(0, path + '/' + name)
  except Exception as e:
    print(e)
  finally:
    file.Close()

さいごに

これで、Excelが何件あってもPDFに楽に変換できる!
Pythonすごい!