「PDFファイルのデータをエクセルに置き換えたいけど、一度にたくさんのファイルってできるの?」
上記の疑問にお答えします。
今回の疑問は、プログラミング言語であるPythonを使うことで解決できます。
以下について順番に説明します。
- PDFファイルをExcelファイルに置き換えるプロセス
- ソースコードの提示&解説
「偉そうに語るおまえは誰やねん。」と思われるので、私のことも少し紹介させてください。
たいらーのプロフィール
- 文系四大出身。ソフトウェア開発の経験はなしですが、IT業界に身を置いています。
- 開発者やユーザーとのパイプ役など、業務にプログラミングスキルを活かす。
- Pythonは独学で習得。スクレイピングや作業の自動化などに勤しんでいます。
PDFファイルのなかのデータを、Excelファイルにひとつひとつコピー&ペーストするのはなかなか面倒です。
エクセルに変換してくれるツールやサービスはありますが、複数ファイルを一度に変換するものはあまり見当たりません。
なので、プログラミングを活用して複数のPDFファイルのデータを一度にExcelファイルに転記する方法を考えてみました。
是非この記事を参考にして、職場などで活用してみてください。
1.PDFファイルをExcelファイルに置き換える手順と概要
まず、どのようにPDFファイルのデータをExcelファイルに置き換えるか説明します。
プログラミング言語は、Pythonを使用します。
方法ですが、PDFファイルをそっくりそのまま変換するのは困難なため、あらかじめエクセルのテンプレートを用意し、そこにデータを転記する方法をとりたいと思います。
※思ってたんと違うなぁという方はごめんなさい。ただ、データ抽出する部分は参考になると思うので、最後までお付き合いいただければと思います。
作業手順は次のとおりです。
- Pythonをインストールする。
- プログラムを実行するフォルダに以下を置く。
・実行するPythonのソースファイル
・Excelファイル(テンプレート)
・データ抽出したいPDFファイル - プログラムを実行する。
プログラムの概要ですが、ざっくり次のようなことをしています。(詳細は後述)
- フォルダ内のPDFファイルを探す。
- ファイル名を取得しておく。
- PDFファイルをWordファイルに変換する。
- Wordファイルから必要なデータを抽出する。
- Excelファイル(テンプレート)に必要なデータを転記する。
- 2のファイル名でExcelファイルを保存する。
- 3から6をファイル数の分だけ繰り返す。
3でわざわざWordファイルに変換しているのは、PDFファイルからExcelファイルに直接は変換できないようなのでこの方法をとっています。
この記事ではイメージがしやすいように、請求書を例にしています。
2.ソースコード提示&解説
ソースコードの全文と解説を記載します。
イメージとしては、次のようなPDFファイルにあるデータが…
※画像を選択すると拡大表示されます。
次のExcelファイルの該当箇所(黄色い部分)に反映されるイメージです。
ソースコード全文
from pdf2docx.main import parse import docx, glob import openpyxl as pyxl filename = glob.glob("*.pdf") #PDFファイルをすべて取得 file_num = len(filename) #PDFファイル数を取得 for i in range(file_num): filename[i] = filename[i].replace(".pdf", "") #ファイル名のみ抽出 #PDFをWORDに変換 pdf_file = filename[i] + ".pdf" #PDFファイル docx_file = filename[i] + ".docx" #WORDファイルを命名 parse(pdf_file, docx_file) #ワードからテキスト抽出する doc =docx.Document(docx_file) # #パラグラフの数 # paragraph_num = len(doc.paragraphs) #パラグラフの数=6 # print(paragraph_num) # #表の数 # table_num = len(doc.tables) #表の数=4 # print(table_num) # tables[0]を調べる # num_row = len(doc.tables[0].rows) #行数=4 # num_column = len(doc.tables[0].columns) #列数=6 # print(num_row,num_column) aite = doc.tables[0].cell(0,0).text #宛先 seikyu_num = doc.tables[0].cell(0,5).text #請求番号 kokyaku = doc.tables[0].cell(1,1).text #顧客側担当者 seikyu_day = doc.tables[0].cell(1,5).text #請求日 kenmei = doc.tables[0].cell(2,0).text #件名 # tables[1]を調べる # num_row = len(doc.tables[1].rows) #行数=2 # num_column = len(doc.tables[1].columns) #列数=5 # print(num_row,num_column) tanto = doc.tables[1].cell(0,4).text #担当者 kigen = doc.tables[1].cell(1,4).text #お支払期限 # tables[2]を調べる # num_row = len(doc.tables[2].rows) #行数=12 # num_column = len(doc.tables[2].columns) #列数=5 # print(num_row,num_column) koumoku_num = doc.tables[2].cell(1,0).text #No tekiyo = doc.tables[2].cell(1,1).text #摘要 suuryo = doc.tables[2].cell(1,2).text #数量 tanka = doc.tables[2].cell(1,3).text #単価 # print(tanka) # print(type(tanka)) # tables[3]を調べる # num_row = len(doc.tables[3].rows) #セルの数(行)=1 # num_column = len(doc.tables[3].columns) #セルの数(列)=2 # print(num_row,num_column) bikou = doc.tables[3].cell(0,1).text #備考の内容 #EXCELのテンプレートに転記 excel_file = "請求書テンプレート.xlsx" wb = pyxl.load_workbook(excel_file) sheet = wb['請求書'] sheet.cell(row =3, column =1).value = aite sheet.cell(row =3, column =14).value = int(seikyu_num) sheet.cell(row =4, column =4).value = kokyaku sheet.cell(row =4, column =14).value = seikyu_day sheet.cell(row =6, column =3).value = kenmei.replace("件名:", "") sheet.cell(row =13, column =13).value = tanto sheet.cell(row =15, column =13).value = kigen sheet.cell(row =18, column =1).value = int(koumoku_num) sheet.cell(row =18, column =2).value = tekiyo sheet.cell(row =18, column =10).value = int(suuryo) sheet.cell(row =18, column =12).value = int(tanka.replace(",", "")) sheet.cell(row =36, column =3).value = bikou wb.save(filename[i] + ".xlsx") #PDFファイルの名前で保存 wb.close
解説
以下の部分で様々なライブラリをインポートしています。
「pdf2docx」はPDFファイルを一度Wordファイルにするために使用しています。
「docx」はWordファイルの中身を調べるために使用しています。
「glob」はファイルパスやファイル数を取得するために使用しています。
「openpyxl」はExcelファイルの編集や保存などをするために使用しています。
from pdf2docx.main import parse import docx, glob import openpyxl as pyxl
以下の部分でPDFファイルを探して、ファイル数を取得しています。
filename = glob.glob("*.pdf") #PDFファイルをすべて取得 file_num = len(filename) #PDFファイル数を取得
for内の処理をPDFファイルの数だけ実行します。…
for i in range(file_num): …
PDFファイル名は、ファイルの命名に使用したいので、ファイル名のみを抽出しています。
filename[i] = filename[i].replace(".pdf", "") #ファイル名のみ抽出
PDFファイルを一度Wordファイルに変換しています。
#PDFをWORDに変換 pdf_file = filename[i] + ".pdf" #PDFファイル docx_file = filename[i] + ".docx" #WORDファイルを命名 parse(pdf_file, docx_file)
以下の処理からは、Wordファイルからテキストを抽出しています。
コメントアウトしたprint文はパラグラフやテーブルの数、中身を調べるために使用しています。
なので、ご自身で活用する場合は、対象のWordファイルに合わせて変数とテーブルの座標を変更してください。
#ワードからテキスト抽出する doc =docx.Document(docx_file) …
テンプレートのExcelファイルを開き、Wordファイルから抽出したデータを転記しています。ご自身で活用する場合は、適切なテンプレートを用意し、座標を変更してください。
※エクセル側で数式を使用している場合は注意してください。上書きされるので、数式が消える可能性があります。
excel_file = "請求書テンプレート.xlsx" wb = pyxl.load_workbook(excel_file) sheet = wb['請求書']
あらかじめ取得しておいたPDFファイルの名前でExcelファイルを保存しています。
wb.save(filename[i] + ".xlsx") #PDFファイルの名前で保存 wb.close
解説は以上です。
3.まとめ
以上、プログラミングを活用して複数のPDFファイルのデータを一度にExcelファイルに置き換える方法をお伝えしました。
ご自身の作業効率を改善したい方、セキュリティやコスト面で有料サービスの導入が難しい方は、参考にしてみてください。
もちろん、これがベストの方法ではないので、アレンジしてもらって結構です。
さらに、Pythonの学習を深めて、より業務の効率化や自動化の技術を身につけたい方は、『Pythonで業務を効率化・自動化しよう【プログラミング未経験でも大丈夫】』の記事もおすすめです。
Pythonを使った業務効率化のテクニックや実際の使用例を紹介しており、プログラミングスキルを活かして日々の業務をよりスムーズに進めるためのヒントが満載です。ぜひこちらの記事もご覧ください。
ご清聴ありがとうございました。