私は、docx ファイル内のテキストを見つけて置き換える方法をたくさん探してきましたが、ほとんど運がありませんでした。docx モジュールを試しましたが、うまくいきませんでした。最終的に、zipfile モジュールを使用し、docx アーカイブ内の document.xml ファイルを置き換えて、以下に説明する方法を考え出しました。これを機能させるには、ドキュメント内の他の既存または将来のテキストと一致しない可能性のある一意の文字列として置き換えたいテキストを含むテンプレート ドキュメント (docx) が必要です (例: 「XXXMEETDATEXXX の XXXCLIENTNAMEXXX との会議は非常にうまくいきました。 」)。
import zipfile
replaceText = {"XXXCLIENTNAMEXXX" : "Joe Bob", "XXXMEETDATEXXX" : "May 31, 2013"}
templateDocx = zipfile.ZipFile("C:/Template.docx")
newDocx = zipfile.ZipFile("C:/NewDocument.docx", "a")
with open(templateDocx.extract("word/document.xml", "C:/")) as tempXmlFile:
tempXmlStr = tempXmlFile.read()
for key in replaceText.keys():
tempXmlStr = tempXmlStr.replace(str(key), str(replaceText.get(key)))
with open("C:/temp.xml", "w+") as tempXmlFile:
tempXmlFile.write(tempXmlStr)
for file in templateDocx.filelist:
if not file.filename == "word/document.xml":
newDocx.writestr(file.filename, templateDocx.read(file))
newDocx.write("C:/temp.xml", "word/document.xml")
templateDocx.close()
newDocx.close()
私の質問は、この方法の何が問題なのですか? 私はこのことにかなり慣れていないので、他の誰かがすでにこれを理解しているはずだと思います。これにより、このアプローチには非常に問題があると思います。しかし、それはうまくいきます!ここで何が欠けていますか?
.
これは、このことを学ぼうとしている他のすべての人のための私の思考プロセスのウォークスルーです。
ステップ 1) 置き換えたいテキスト文字列をキーとし、新しいテキストをアイテムとする Python 辞書を準備します (例: {"XXXCLIENTNAMEXXX" : "Joe Bob", "XXXMEETDATEXXX" : "May 31, 2013"})。
ステップ 2) zipfile モジュールを使用してテンプレート docx ファイルを開きます。
ステップ 3) 追加アクセス モードで新しい新しい docx ファイルを開きます。
ステップ 4) テンプレート docx ファイルから document.xml (すべてのテキストが存在する場所) を抽出し、xml をテキスト文字列変数に読み取ります。
手順 5) for ループを使用して、辞書で定義されている xml テキスト文字列のすべてのテキストを新しいテキストに置き換えます。
ステップ 6) xml テキスト文字列を新しい一時 xml ファイルに書き込みます。
ステップ 7) for ループと zipfile モジュールを使用して、テンプレート docx アーカイブ内のすべてのファイルを新しい docx アーカイブにコピーします。ただし、word/document.xml ファイルは除きます。
ステップ 8) 置き換えられたテキストを含む一時 xml ファイルを、新しい word/document.xml ファイルとして新しい docx アーカイブに書き込みます。
ステップ 9) テンプレートと新しい docx アーカイブを閉じます。
ステップ 10) 新しい docx ドキュメントを開いて、置き換えられたテキストをお楽しみください!
-- 編集 -- 7 行目と 11 行目の閉じ括弧 ')' がありません