12

私は、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 行目の閉じ括弧 ')' がありません

4

2 に答える 2

2

時々、Word は奇妙なことをします。テキストを削除して、途中でテキストを編集せずに、一気に書き直す必要があります。

ドキュメントは xml ファイルに保存されます (通常、解凍後、docx の場合は word/document.xml に保存されます)。場合によっては、テキストが 1 つのストロークではない可能性があります。ドキュメントのどこかでそれらが XXXCLIENT であり、別の場所で NAMEXXX である可能性があります。

このようなもの:

<w:t> XXXCLIENT </w:t> ... <w:t> NAMEXXX </w:t>

これは、言語サポートのために非常に頻繁に発生します。単語は、1 つの単語が 1 つの特定の言語であると考えたときに単語を分割し、単語間でそうする可能性があり、単語が複数のタグに分割されます。

あなたのソリューションの唯一の問題は、すべてを一度に書かなければならないことです。これは、最もユーザーフレンドリーではありません。

タグのような口ひげを使用する JS ライブラリを作成しました: {clientName} https://github.com/edi9999/docxgenjs

アルゴリズムと同じようにグローバルに機能しますが、コンテンツが一筆書きでない場合でもクラッシュしません (Word で {clientName} を記述すると、通常、テキストは文書内で分割されます: {, clientName, }.

于 2013-06-06T13:45:08.640 に答える
-1

回避策を試すことができます。Word の検索/置換を使用して、テキストを 1 回のストロークで取得します。

たとえば、 を検索し"XXXCLIENTNAMEXXX"て再度置き換え"XXXCLIENTNAMEXXX"ます。

于 2016-02-12T14:08:08.077 に答える