17

それぞれが特定のコンテンツを持つ単語ファイルはほとんどありません。docxPythonライブラリを使用しているときに、単語ファイルを 1 つのファイルに結合する方法を示す、または理解するのに役立つスニペットが必要です。

たとえば、pywin32 ライブラリでは次のようにしました。

rng = self.doc.Range(0, 0)
for d in data:
    time.sleep(0.05)

    docstart = d.wordDoc.Content.Start
    self.word.Visible = True
    docend = d.wordDoc.Content.End - 1
    location = d.wordDoc.Range(docstart, docend).Copy()
    rng.Paste()
    rng.Collapse(0)
    rng.InsertBreak(win32.constants.wdPageBreak)

docxしかし、代わりにPythonライブラリを使用しながらそれを行う必要がありますwin32.client

4

7 に答える 7

19

上記の例を、最新バージョンのpython-docx (執筆時点では 0.8.6) で動作するように調整しました。これは要素をコピーするだけであることに注意してください (要素のスタイルをマージするのはより複雑です):

from docx import Document

files = ['file1.docx', 'file2.docx']

def combine_word_documents(files):
    merged_document = Document()

    for index, file in enumerate(files):
        sub_doc = Document(file)

        # Don't add a page break if you've reached the last file.
        if index < len(files)-1:
           sub_doc.add_page_break()

        for element in sub_doc.element.body:
            merged_document.element.body.append(element)

    merged_document.save('merged.docx')

combine_word_documents(files)
于 2016-11-08T15:25:35.383 に答える
4

単純なドキュメントをテキストのみと組み合わせる必要がある場合は、上記の python-docx を使用できます。

ハイパーリンク、画像、リスト、箇条書きなどを含むドキュメントをマージする必要がある場合は、lxml を使用してこれを実行し、ドキュメントの本文とすべての参照ファイルを次のように結合できます。

  • ワード/styles.xml
  • ワード/ナンバリング.xml
  • ワード/メディア
  • [コンテンツ タイプ].xml
于 2015-03-25T20:52:27.023 に答える
2

これはすべて非常に便利です。Martijn Jacobs と Mr Kriss の回答をまとめました。

def combine_word_documents(input_files):
    """
    :param input_files: an iterable with full paths to docs
    :return: a Document object with the merged files
    """
    for filnr, file in enumerate(input_files):
        # in my case the docx templates are in a FileField of Django, add the MEDIA_ROOT, discard the next 2 lines if not appropriate for you. 
        if 'offerte_template' in file:
            file = os.path.join(settings.MEDIA_ROOT, file)

        if filnr == 0:
            merged_document = Document(file)
            merged_document.add_page_break()

        else:
            sub_doc = Document(file)

            # Don't add a page break if you've reached the last file.
            if filnr < len(input_files)-1:
                sub_doc.add_page_break()

            for element in sub_doc.element.body:
                merged_document.element.body.append(element)

    return merged_document
于 2017-09-25T12:22:29.130 に答える