Pythonを使用してMicrosoft ExcelとWordを自動連係(3/3)

調査研究

1.Pythonを使用してMicrosoft ExcelとWordを自動連係(3/3)まとめ

・Wordファイルのひな型に画像とExcelから抽出を使ってデータを挿入してレポートを作成
・動作させるためにはWordファイルのひな型と画像が必要だがそれがあればColabで動かせる
・docxtplを使うとひな形内にスムーズにデータを挿入して自動でレポートの作成が可能

2.PythonでWordのレポートを自動生成

以下、www.kdnuggets.comより「Automate Microsoft Excel and Word Using Python」の意訳です。元記事の投稿は2021年8月、Mohammad Khorasaniさんによる投稿です。

前回からの続きで
3)保存した画像とExcel内の表データをWordファイルのひな型に反映する
の部分です。Google Colab上でも動かせる事を確認済です。挿入する画像とひな形として使うwordファイル(.docx)を別途Colabの/content以下にアップロードする必要はありますので用意できていない方は前回を参照してご用意ください。

アイキャッチ画像のクレジットはPhoto by Mohammad Rezaie on Unsplash

Microsoft Wordの自動化

グラフ画像が生成されたので、次は通常のMicrosoft Wordドキュメント(.docx)形式でひな形を作成する必要があります。

これは、書体、フォントサイズ、書式設定、ページ構造など、レポートの外観とまったく同じように作成されます。次に、自動化用に元コンテンツにプレースホルダー、つまりテーブル値と画像を配置する場所を作成しまし。以下に示すように変数名で宣言するだけです。


Microsoft Wordで作ったひな型

自動生成コンテンツは、テキストも画像も、{{ 変数名 }}で宣言できます。

テーブルの場合、すべての列が含まれるテンプレート行を含んだテーブルを作成する必要があります。そして、以下の表記を使用して、最初の行と最後の行に1行を追加する必要があります。

最初の行: {%tr for item in variable_name %}

最後の行: {%tr endfor %}

上の図では、変数名は次のとおりです。

・表形式のデータを格納するPython dictionary型のtable_contents
・dictionaryのkeyであるindex(最初の列)
・dictionaryのvalueである電力、電流、および電圧(2列目、3列目、および4列目)

次に、テンプレートドキュメントをPythonにインポートし、テーブルの値を格納するdictionaryを作成します。

次に、最初にExcelで作成したグラフ画像をインポートし、テンプレートドキュメントで宣言されたすべてのプレースホルダー変数を実体化するために別のdictionaryを作成します。

最後に、表の値とグラフの画像を使用してレポートをレンダリングします。

訳注:以下、Colab上で動かす事が前提です。最初に必要なパッケージをインストールしてください。


!pip install openpyxl
!pip install python-docx
!pip install docxtpl

以下、前々回のコードです。新規にExcelファイルを作成し、表データを補完しています。

import pandas as pd

# 元Excelファイルを作成
df = pd.DataFrame([
  ["", "0.5", "0.6"],
  ["", "0.5", "1.2"],
  ["", "0.5", "2.4"],
  ["", "0.5", "4.8"],
  ["", "1", "4.8"],
  ["", "1", "0.6"],
  ["", "1", "0.6"]],
columns=['電力', '電流', '電圧'])

df.to_excel(f"テストエクセルワークブック.xlsx", index = False, sheet_name='シート1')

import openpyxl as xl
from openpyxl.chart import LineChart, Reference
workbook = xl.load_workbook('テストエクセルワークブック.xlsx')
sheet_1 = workbook['シート1']

for row in range(2, sheet_1.max_row + 1):
  current = sheet_1.cell(row, 2)
  voltage = sheet_1.cell(row, 3)
  power = float(current.value) * float(voltage.value)
  power_cell = sheet_1.cell(row, 1)
  power_cell.value = power

values = Reference(sheet_1, min_row = 2, max_row = sheet_1.max_row, min_col = 1, max_col = 1)
chart = LineChart()

chart.y_axis.title = '電流'
chart.x_axis.title = 'インデックス'
chart.add_data(values)
sheet_1.add_chart(chart, 'e2')
workbook.save('テストエクセルワークシート2.xlsx')

以下からが今回のテーマであるWordのテンプレートからレポートを自動生成する処理です。実行前にWordのひな型を「テストワード.docx」、レポート内に挿入したい画像をchart.pngとして保存しておいてください。


import openpyxl as xl
from openpyxl.chart import LineChart, Reference
workbook = xl.load_workbook('/content/テストエクセルワークシート2.xlsx')
sheet_1 = workbook['シート1']

from docx.shared import Cm
from docxtpl import DocxTemplate, InlineImage
import datetime

template = DocxTemplate('/content/テストワード.docx')

table_contents = []

for i in range(2, sheet_1.max_row + 1):
  table_contents.append({
  'index': i-1,
  'power': sheet_1.cell(i, 1).value,
  'current': sheet_1.cell(i, 2).value,
  'voltage': sheet_1.cell(i, 3).value
  })

#画像の読み込み
image = InlineImage(template,'/content/chart.png',Cm(10))

context = {
  'title': 'Automated Report',
  'day': datetime.datetime.now().strftime('%d'),
  'month': datetime.datetime.now().strftime('%b'),
  'year': datetime.datetime.now().strftime('%Y'),
  'table_contents': table_contents,
  'image': image
}

#テンプレートからレポートの作成
template.render(context)
template.save('/content/自動生成ワードレポート.docx')

結果

これにより、Microsoft Excelで作成された数値とグラフを含む自動生成されたMicrosoft Wordレポートが表示されます。完全に自動化されたパイプラインを使用して、必要な数のテーブル、チャート、およびドキュメントを作成できます。

以上です。

データの視覚化とPythonについてもっと詳しく知りたい場合は、次のコースを自由にチェックしてください。

Pythonによるデータの視覚化

Python for Everybody Specialization

このチュートリアルのソースコードとテンプレートは、次のGitHubリポジトリにあります。
mkhorasani / excel_word_automation

さらに、Mediumを購読して、ここで私のチュートリアルの詳細を探索してください。

略歴:Mohammad Khorasaniは、データサイエンティストとエンジニアのハイブリッドです。
ロジスティクス。率直。レアルポリティーク。「一度に一つの事」の教義を信奉していません。

3.Pythonを使用してMicrosoft ExcelとWordを自動化(3/3)まとめ

1)www.kdnuggets.com
Automate Microsoft Excel and Word Using Python

2)openpyxl.readthedocs.io
openpyxl – A Python library to read/write Excel 2010 xlsx/xlsm files

3)github.com
pywin32

4)python-docx.readthedocs.io
python-docx — python-docx 0.8.11 documentation

5)docxtpl.readthedocs.io
Welcome to python-docx-template’s documentation!

 

タイトルとURLをコピーしました