年賀状の宛名書きをはじめ、エクセルからデータを取り出してワードに貼り付けるのって大変ですよね。
宛名書きソフトもありますが、様式が自分の思うものと違っていたり、アップデートでつかえなくなってたり・・・
データを取り出して順番にはりつけるのはプログラミングの得意とするところです。
この記事では
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形式」にしておく必要があります。
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
で表記します。
後で置換するので文中にある単語を使うのは避けましょう。
例としてこんな文章を使います。
住所: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」に置換してできた内容を保存
住所:住所テスト
名前テスト 様
拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。
敬具
Dr.レオ
無事に名前の欄と住所の欄を違う言葉に置き換えて保存することができました。
3. pandasで読んだエクセルのデータをワードに流し込む
全てのパラグラフに対して、エクセルから取得したデータの置換を行えば、全員分の手紙が一気にできるわけです。
例えば、はじめに説明した以下の表
name | address |
---|---|
パイソン太郎 | 〇〇県〇〇市 |
アール次郎 | □□県□□市 |
シー花子 | △△県△△市 |
を以下のワードファイルに流し込みます。
住所: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]) )
#文書をそれぞれの名前で保存する
保存されたファイルをみると
住所:〇〇県〇〇市
パイソン太郎 様
拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。
敬具
Dr.レオ
住所:□□県□□市
アール次郎 様
拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。
敬具
Dr.レオ
住所:△△県△△市
シー花子 様
拝啓
このたびプログラム学会に入会させていただきたくお手紙書きました。
よろしくお願いします。
敬具
Dr.レオ
という具合です。
csvファイルの内容とワードファイルの中の変数の使い方によっていろいろな使い方ができます。
プログラミングの醍醐味ですね。