Pythonを使うとExcelデータをもとに、Wordの記載内容を置換し、差し込み印刷が可能です。
ここでは実務の事例として、顧客リスト(Excel)をもとに、テンプレートファイル(Word)の文言を置換してPDF化するPythonプログラムを紹介します。
・WordテンプレートへExcelデータで置換する
・PDFへ変換する
それでは以下で詳しく紹介していきます。
目次
- 1 PythonでExcelデータからWordの記載を変換するプログラムの概要
- 2 Pythonプログラムを実行するための3つの準備
- 3 Pythonプログラム解説
- 3.1 プログラム1|ライブラリの設定
- 3.2 プログラム2|「sample.xlsx」を開いて「Sheet1」を読み込む
- 3.3 プログラム3|Excelの「Sheet1」の全データをリストとして取得
- 3.4 プログラム4|Pythonファイルが保管されているフォルダパスを取得
- 3.5 プログラム5|win32comでwordアプリケーションを起動
- 3.6 プログラム6|Excelリストを2行目から最終行まで繰り返す
- 3.7 プログラム7|テンプレートとなるwordファイルを呼び出す
- 3.8 プログラム8|プログラム3のリストを辞書に変換
- 3.9 プログラム9|テンプレートファイル(Word)の文言をプログラム8の辞書データで置換
- 3.10 プログラム10|Wordファイルを名前を変えて保存
- 3.11 プログラム11|WordファイルをPDFに変換して保存
- 3.12 プログラム12|Wordファイルを閉じる
- 4 Pythonについて詳しく理解したいなら
PythonでExcelデータからWordの記載を変換するプログラムの概要
今回は以下の作業をpythonで行うことを目指します。
1. 元のデータが格納されているエクセルファイルを読み込む
2. Wordのテンプレートファイルの文言を置換する
3. PDFとして保存する
詳しいプログラム解説は後半で行います。
Pythonプログラムを実行するための3つの準備
1. テンプレートファイル(Word)の準備
2. 顧客リスト(Excel)の準備
3. Pythonプログラムに必要なライブラリをインストール
準備1|テンプレートファイル(Word)を作成
今回は上の画像のようなテンプレートファイル(Word)を準備しました。
このテンプレートファイル内の以下の文言は、準備2の顧客リスト(Excel)の情報に置換していきます。
・[姓]
・[名]
・[住所]
・[電話番号]
・[メールアドレス]
準備2|顧客リスト(Excel)の作成
今回の事例では、顧客リストの情報をもとが記入されたエクセルを事前に準備しておきます。
準備3|必要ライブラリのインストール
今回は以下の3つのライブラリをインストールします。
pip install openpyxl
pip install python-docx
pip install win32com
以下のプログラムでは、上記の3つをインストールしておかないと動かないので、注意が必要です。
Pythonプログラム解説
この記事で紹介するプログラムを解説しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#プログラム1|ライブラリ設定 from docx import Document import win32com.client import openpyxl as px import os #プログラム2|「sample.xlsx」を開いて「Sheet1」を読み込む filepath = 'Sample.xlsx' wb = px.load_workbook(filename=filepath) ws1 = wb['Sheet1'] #プログラム3|Excelの「Sheet1」の全データをリストとして取得 values1 = [[cell.value for cell in row1] for row1 in ws1] #プログラム4|Pythonファイルが保管されているフォルダパスを取得 curdir = os.getcwd() #プログラム5|win32comでwordアプリケーションを起動 word = win32com.client.Dispatch("Word.Application") word.Visible = True word.DisplayAlerts = False #プログラム6|Excelリストを2行目から最終行まで繰り返す for i in range(1, len(values1)): #プログラム7|テンプレートとなるwordファイルを呼び出す templatepath = 'Template.docx' doc = Document(templatepath) #プログラム8|プログラム3のリストを辞書に変換 dic = dict(zip(values1[0], values1[i])) #プログラム9|テンプレートファイル(Word)の文言をプログラム8の辞書データで置換 for key, value in dic.items(): for paragraph in doc.paragraphs: paragraph.text = paragraph.text.replace(key, value) #プログラム10|Wordファイルを名前を変えて保存 word_newFilePath = f'{i}_{values1[i][0]}_{values1[i][1]}.docx' doc.save(word_newFilePath) wordfile = os.path.join(curdir, word_newFilePath) #プログラム11|WordファイルをPDFに変換して保存 wordDoc = word.Documents.Open(wordfile) pdf_newFileName = f'{i}_{values1[i][0]}_{values1[i][1]}.pdf' pdf_fileFullPath = os.path.join(curdir, pdf_newFileName) wordDoc.SaveAs2(pdf_fileFullPath, FileFormat=17) #プログラム12|Wordファイルを閉じる wordDoc.Close() # プログラム13|Wordアプリケーションを閉じる word.DisplayAlerts = True word.Quit() |
以下で詳しく説明しています。
プログラム1|ライブラリの設定
1 2 3 4 5 |
#プログラム1|ライブラリ設定 from docx import Document import win32com.client import openpyxl as px import os |
このライブラリでwordの文言置換を実施します。
このライブラリでwordのPDF化の際に、使用します。
Excelを操作するためのopenpyxlです。pxという短縮形で呼び出すようにします。
ファイルのフルパスを取得するときに使用します。
プログラム2|「sample.xlsx」を開いて「Sheet1」を読み込む
1 2 3 4 |
#プログラム2|「sample.xlsx」を開いて「Sheet1」を読み込む filepath = 'Sample.xlsx' wb = px.load_workbook(filename=filepath) ws1 = wb['Sheet1'] |
Pythonファイルと同じフォルダにSample.xlsx」を保管しておきます。
filepathという変数に「Sample.xlsx」を設定することで、次のプログラムでExcelファイルを読み込みます。
「Sample.xlsx」を呼び出し、読み込んだExcelをwbという変数で設定します。
Excel(wb)の「Sheet1」をws1という変数に設定します。
プログラム3|Excelの「Sheet1」の全データをリストとして取得
1 2 |
#プログラム3|Excelの「Sheet1」の全データをリストとして取得 values1 = [[cell.value for cell in row1] for row1 in ws1] |
ExcelのSheet1(ws1)の全データをvalues1というリストに格納します。
プログラム4|Pythonファイルが保管されているフォルダパスを取得
1 2 |
#プログラム4|Pythonファイルが保管されているフォルダパスを取得 curdir = os.getcwd() |
Pythonファイルが保管されているフォルダパスを取得します。
win32comを使用しますが、win32comでファイルを起動したり保存したりするときはフルパスが必要になります。
よって、ここでカレントディレクトリ(Pythonファイルが保管されているフォルダ)をcurdirとして取得しておきます。
プログラム5|win32comでwordアプリケーションを起動
1 2 3 4 |
#プログラム5|win32comでwordアプリケーションを起動 word = win32com.client.Dispatch("Word.Application") word.Visible = True word.DisplayAlerts = False |
win32comでWordアプリケーションを起動し、wordという変数に設定します。
wordを画面上に表示させる。
なお、「word.Visible = False」でモニター上に非表示で実行することも可能です。
wordの警告表示の設定をOFFにします。これでプログラム実行中は、警告が表示されなくなります。
プログラム6|Excelリストを2行目から最終行まで繰り返す
1 2 |
#プログラム6|Excelリストを2行目から最終行まで繰り返す for i in range(1, len(values1)): |
リストの要素番号は0から開始ですが、0にしてしまうとヘッダー情報を取得してしまいます。
そこで「range(1, len(values1))」とすることで、2行目から最終行まで取得すること可能です。
プログラム7|テンプレートとなるwordファイルを呼び出す
1 2 3 |
#プログラム7|テンプレートとなるwordファイルを呼び出す templatepath = 'Template.docx' doc = Document(templatepath) |
「Template.docx」をtemplatepathの変数に設定します。
「Template.docx」はPythonファイルと同じフォルダに保管しておきます。
docでtemplatepath(「Template.docx」)のワードファイル呼び出します。
ここはプログラム1の「from docx import Document」のDocumentを使ってwordファイルを起動しています。
プログラム8|プログラム3のリストを辞書に変換
1 2 |
#プログラム8|プログラム3のリストを辞書に変換 dic = dict(zip(values1[0], values1[i])) |
変数dicでkeyにヘッダー情報(values1[0])を、valuesに各行の値(values1[i])を入れ込む
辞書として以下のようにデータを格納していきます。
i=1のとき
key | [姓] | [名] | [住所] | [電話番号] | [メールアドレス] |
---|---|---|---|---|---|
value | 門司 | 留美 | 茨城県つくば市臼井10-14-11 | 03-5585-6163 | luctus@gild-a.ob.jp |
i=2のとき
key | [姓] | [名] | [住所] | [電話番号] | [メールアドレス] |
---|---|---|---|---|---|
value | 倉敷 | 彰 | 兵庫県篠山市古市14-4-1 | 037-941-4680 | justo@cize.euces.ne.jp |
i=10のとき
key | [姓] | [名] | [住所] | [電話番号] | [メールアドレス] |
---|---|---|---|---|---|
value | 福知山 | 謙次 | 奈良県生駒郡斑鳩町龍田南9-4-2 | 038-368-2843 | rhoncus@wuw41.unc.ne.jp |
上記のような辞書をi=1,2,・・・,len(values1)まで作成していきます。
以下でkeyとvalueを活用して置換していきます。
プログラム9|テンプレートファイル(Word)の文言をプログラム8の辞書データで置換
1 2 3 4 |
#プログラム9|テンプレートファイル(Word)の文言をプログラム8の辞書データで置換 for key, value in dic.items(): for paragraph in doc.paragraphs: paragraph.text = paragraph.text.replace(key, value) |
辞書配列dic.items()からkeyとvalueを取得します。
ちなみにkeyとvalueは上記の表で示したとおり、keyはヘッダー情報、valueは各行(2行目~10行目)となります。
wordファイルの各パラグラフを一つずつ取り出して処理をします。
各パラグラフの文章テキストの中で、keyをvalueに置換していきます。
プログラム10|Wordファイルを名前を変えて保存
1 2 3 4 |
#プログラム10|Wordファイルを名前を変えて保存 word_newFilePath = f'{i}_{values1[i][0]}_{values1[i][1]}.docx' doc.save(word_newFilePath) wordfile = os.path.join(curdir, word_newFilePath) |
pdfとして保存するときにファイル名を設定します。
「f'{i}_{values1[i][0]}_{values1[i][1]}.docx’」とすることで、{}内には変数を出力し、それ以外の箇所は文字列を出力することができます。
したがって、i=1, value1[i][0]=門司 ,value1[i][0]=留美 のとき、「1_門司_留美.docx」となります。
ワードファイルを上記のファイル名で保存します。
この時点でフォルダは以下のように文字列置換後のwordファイルが保存されます。
「os.path.join(フォルダパス, ファイルパス)」とすることで、フルパス(絶対パス)とします。
プログラム11以降でwin32comを使うのですが、win32comでファイルを開くときフルパスが必要になるため、この処理を入れておきます。
プログラム11|WordファイルをPDFに変換して保存
1 2 3 4 5 |
#プログラム11|WordファイルをPDFに変換して保存 wordDoc = word.Documents.Open(wordfile) pdf_newFileName = f'{i}_{values1[i][0]}_{values1[i][1]}.pdf' pdf_fileFullPath = os.path.join(curdir, pdf_newFileName) wordDoc.SaveAs2(pdf_fileFullPath, FileFormat=17) |
wordfileのワードファイルを開いて、変数wordDocとする。
pdfとして保存するときにファイル名を設定します。
「f'{i}_{values1[i][0]}_{values1[i][1]}.pdf’」とすることで、{}内には変数を出力し、それ以外の箇所は文字列を出力することができます。
したがって、i=1, value1[i][0]=門司 ,value1[i][0]=留美 のとき、「1_門司_留美.pdf」となります。
「os.path.join(フォルダパス, ファイルパス)」とすることで、フルパス(絶対パス)とします。
win32comを使う場合、フルパスが必要になるため、この処理を入れておきます。
「.SaveAs2(ファイル名, FileFormat = 17)」とすることで、PDFを出力することができます。
FileFormat=17がPDF印刷です。
PDF保存されたファイルを開いてい見ると、全て置換されていることが分かります。
このプログラム終了時点で以下のようになっています。
プログラム12|Wordファイルを閉じる
1 2 |
#プログラム12|Wordファイルを閉じる wordDoc.Close() |
プログラム11で開いたワードファイルを閉じます。
1 2 |
word.DisplayAlerts = True word.Quit() |
警告画面の出力を元の設定(エラー表示ON)に戻しておきます。
最後にWordアプリケーションごと閉じてプログラムを終了します。
プログラムの解説はここまでです。
Pythonについて詳しく理解したいなら
Pythonを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にPythonを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
Pythonの難易度などについては、以下で紹介しています。
勉強の参考になれば幸いです。