【Python】Excelの図形の中のテキストを置換する

公開日:  

python excel


Pythonを使ってExcelファイルの図形内にあるテキストを置換します。
また、図形の中のテキストを読み取ったり、図形の中にテキストを書き込んだりする例にもなっています。

まず最初に実行前と実行後のExcelファイルのスクリーンショットを載せます。
図形内のテキストが変化しているのを確認してください。

置換前

置換前

置換後 - 図形内のテキストが置換されている

置換後 - 図形内のテキストが置換されている

ちなみに、図形内ではなくセル内のテキストを置換する例は以下のページで解説しています。

環境

  • Windows 10
  • Microsoft Excel 2016
  • Python 3.6.2

必要なモジュールをインストール

次のコマンドを実行してwin32comをインストールしてください。

pip install pywin32

図形の中のテキストを置換する

次のようなフォルダ構成を想定しています。

/
├ template.xlsx  ← 対象のエクセルファイル
└ main.py        ← Pythonスクリプト

以下がPythonのスクリプトとなります。
ハイライトされている部分でテキストの置換を行っています。

import win32com.client
from pywintypes import com_error
from pathlib import Path


# 検索する文字列: 置換する文字列
REPLACE_TXTS = {
    '{{テキスト1}}': 'こんにちは。',
    '{{テキスト2}}': 'おはようございます。'
}

nowdir = Path(__file__).absolute().parent

excel = win32com.client.Dispatch('Excel.Application')

excel.Visible = False

try:
    # xlsxファイルを開く
    wb = excel.Workbooks.Add(str(nowdir / 'template.xlsx'))
    sheet = wb.WorkSheets(1)
    sheet.Activate()

    # 図形内のテキストを置換
    for shape in sheet.shapes:
        src_text = shape.TextFrame.Characters().Text
        for search_txt, replace_txt in REPLACE_TXTS.items():
            src_text = src_text.replace(search_txt, replace_txt)
        shape.TextFrame.Characters().Text = src_text

    # 別名で保存
    wb.SaveAs(str(nowdir / 'new.xlsx'))

except com_error as e:
    print('失敗。', e)
else:
    print('成功。')
finally:
    wb.Close(False)
    excel.Quit()

下記が処理の流れです。

  1. 置換する文字列を定義しておく
    まずは置換前と置換後の文字列を定義しておきます。後の置換処理で使用します。

  2. xlsxファイルを開く
    エクセルファイルを開いてシートを選択(Activate)します。
    Workbooks.Addしているのでファイルを開くというよりは、そのファイルをコピーして作業中のブックとして使用する感じです。

  3. 置換処理を行う
    sheet.shapesでシート内の図形をすべて取得し、それらをループ処理していきます。
    図形の中のテキストをshape.TextFrame.Characters().Textで取得し、そのテキストに対して置換処理を行います。
    置換処理後のテキストを図形のテキストに代入します。

  4. xlsxファイルを保存する
    元のファイルが置き換わるのが嫌なので、別名でファイルを保存します。

参考

以下VBAのリファレンスですが参考までに。



関連記事