Python

Pythonでエクセルの宛名リストをワードに貼り付ける

年賀状の宛名書きが終わらない・・・
宛名書きソフトでやればいいじゃない
ソフトがもう使えなくなってるんです。。
エクセルからワードに貼り付けるのもPythonで簡単にできるよ。

年賀状の宛名書きをはじめ、エクセルからデータを取り出してワードに貼り付けるのって大変ですよね。
宛名書きソフトもありますが、様式が自分の思うものと違っていたり、アップデートでつかえなくなってたり・・・

データを取り出して順番にはりつけるのはプログラミングの得意とするところです。

この記事では

Pythonを使ってエクセルデータを簡単にワードに貼り付けられる方法

を説明します。

イメージでいうと下の図のような流れです。

0.下準備 pandasとpython-docxの準備

Pythonのツールとして、「pandas」と「python-docx」を使います。
pandasはanacondaを導入していれば使えます。
なければ

pip install pandas

でインストールできます。

python-docxはWordファイルをPythonから操作できるツールです。

pip install python-docx

でインストールできます。

1.pandasで住所録を読み取る

試しに住所、名前のはいったファイルに「address.csv」と名前をつけて下のように準備します。
エクセルファイルの名前をつけて保存で「csv形式」にしておく必要があります。

address.csv
name address
パイソン太郎 〇〇県〇〇市
アール次郎 □□県□□市
シー花子 △△県△△市

これを表形式のデータフレームにして読み取ります。

import pandas as pd
df = pd.read_csv('address.csv', encoding="SHIFT-JIS")

日本語表記なのでencodingの指定が必要になります。

print(df['name'])

0 パイソン太郎
1 アール次郎
2 シー花子
Name: name, dtype: object

print(df['address'])

0 〇〇県〇〇市
1 □□県□□市
2 △△県△△市
Name: address, dtype: object

これでデータフレームに名前と住所のデータが入りました。

2. python-docxでワードのdocxファイルを操作する

python-docxファイルではワードのファイルを読み込むことができます。

書き込みたいファイルを「letter.docx」ファイルとしておき、名前、住所を差し込みたい欄を変数で記載しておきます。
ここでは
名前をname, 住所をaddress
で表記します。
後で置換するので文中にある単語を使うのは避けましょう。

例としてこんな文章を使います。

letter.docx

住所:address
name 様

拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。

敬具
Dr.レオ

このdocxファイルをpythonで読み取ってあげて、エクセルから読み取ったデータフレームの情報に置換します。

import docx
document = docx.Document('letter.docx')

この変数
「document」
の中に文書のデータが入ります。

document.paragraphsという要素に段落ごとのパラグラフの文書が入っています。
文書内のテキストデータは.textで書き出せます。


print(document.paragraphs[0].text)
住所:address
print(document.paragraphs[1].text) 

#改行のみなので何も入っていない 
print(document.paragraphs[2].text) 
name 様 
print(document.paragraphs[3].text) 
拝啓 
print(document.paragraphs[4].text) 
 このたびプログラム学会に入会させていただきたくお手紙書きました。 
print(document.paragraphs[5].text) 
よろしくお願いします。 
print(document.paragraphs[6].text)
 
#改行のみなので何も入っていない 
print(document.paragraphs[7].text) 
敬具 
print(document.paragraphs[8].text) 
Dr.レオ

という具合です。
このparagraph中の目的の文字列をエクセルから読み取ったデータで置換してやると、
目的の文書データができます。

例えば


print(document.paragraphs[0].text)
print(document.paragraphs[2].text)

住所:address
name 様


document.paragraphs[0].text = document.paragraphs[0].text.replace('address','住所テスト')
#1つめのパラグラフの内容を置換したものに置き換える
document.paragraphs[2].text = document.paragraphs[2].text.replace('name','名前テスト')
#3つめのパラグラフの内容を置換したものに置き換える
print(document.paragraphs[0].text)
print(document.paragraphs[2].text)

住所:住所テスト
名前テスト 様

です。
この目的の文書データは「.save」で保存できます。

document.save('letter_new.docx')
#「letter_new.docx」に置換してできた内容を保存
letter_new.docx

住所:住所テスト

名前テスト 様
拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。

敬具
Dr.レオ

無事に名前の欄と住所の欄を違う言葉に置き換えて保存することができました。

3. pandasで読んだエクセルのデータをワードに流し込む

全てのパラグラフに対して、エクセルから取得したデータの置換を行えば、全員分の手紙が一気にできるわけです。

例えば、はじめに説明した以下の表

name address
パイソン太郎 〇〇県〇〇市
アール次郎 □□県□□市
シー花子 △△県△△市

を以下のワードファイルに流し込みます。

letter.docx

住所:address
name 様

拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。

敬具
Dr.レオ

ワードの’name’の欄にエクセル「name」の項目を
ワードの’address’の欄にエクセル「address」の項目
を入れて、
ファイル名を
「letter_(それぞれの名前).docx」
というファイルで保存します。

ここでは基本的な書き方で1つ例を書いておきます。


import pandas as pd 
import docx 

df = pd.read_csv('address.csv', encoding="SHIFT-JIS") 
#データフレームに名前と住所の表を読み込む
document = docx.Document('letter.docx')   
#ワードの文書をdocumentという変数に入れる
for i in range(len(df)):  #データフレーム内のデータの数だけ繰り返す
    for j in range(len(document.paragraphs)):  #文書内のパラグラフ全部に置換をかける
        document.paragraphs[j].text = document.paragraphs[j].text.replace('address',df['address'][i]) 
        #「address」をそれぞれの住所に置き換える
        document.paragraphs[j].text = document.paragraphs[j].text.replace('name',df['name'][i]) 
        #「name」をそれぞれの名前に置き換える
    document.save('letter_{}.docx'.format(df['name'][i]) )
    #文書をそれぞれの名前で保存する 

 
保存されたファイルをみると

letter_パイソン太郎.docx

住所:〇〇県〇〇市

パイソン太郎 様
拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。

敬具
Dr.レオ

letter_アール次郎.docx

住所:□□県□□市

アール次郎 様
拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。

敬具
Dr.レオ

letter_シー花子.docx

住所:△△県△△市

シー花子 様
拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。

敬具
Dr.レオ

という具合です。

csvファイルの内容とワードファイルの中の変数の使い方によっていろいろな使い方ができます。

日頃のくりかえしの雑用を解決する。
プログラミングの醍醐味ですね。