Как открыть / сохранить файл docx для добавления в xml и сохранить результат в формате docx после редактирования с использованием python - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть файл docx, в котором мне нужно отредактировать его абзацы (абзацы могут содержать уравнения). Я пытался выполнить эту работу, используя python-docx, но это не удалось, так как редактирование текста каждого абзаца и замена его на отредактированный новый абзац требует вызова p.add_paragraphs(editText(paragraph.text)), который игнорирует и пропускает любое математическое уравнение.

В поисках метода для достижения этой цели я обнаружил, что эту работу можно выполнить с помощью XML кодов, найдя <w:t> теги и отредактировав их содержимое следующим образом:

tree= ET.parse(filename)
root=tree.getroot()

for par in root.findall('w:p'):
   if par.find('w:r'):
   myText= par.find('w:r').find('w:t')
   myText.text= editText(myText.text)

Затем я должен сохранить результат как DOCX. Мой вопрос: какой формат имени файла? это должен быть документ. xml файл? Если так, как я могу достичь этого из моего оригинального файла document.docx? и еще один вопрос: как мне снова сохранить результат в виде файла .docx?

Для сохранения docx как xml я дал попытку сохранить его как document.save('Document2.xml'). Но содержание результата было неверным.

Не могли бы вы дать мне несколько советов, как это сделать?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Ничего подобного не испытал, но, возможно, это то, что вы искали? https://virantha.com/2013/08/16/reading-and-writing-microsoft-word-docx-files-with-python/ Из статьи:

import zipfile
from lxml import etree
class DocsWriter:
    def __init__(self, docx_file):
        self.zipfile = zipfile.ZipFile(docx_file)


    def _write_and_close_docx (self, xml_content, output_filename):
        """ Create a temp directory, expand the original docx zip.
            Write the modified xml to word/document.xml
            Zip it up as the new docx
        """

        tmp_dir = tempfile.mkdtemp()

        self.zipfile.extractall(tmp_dir)

        with open(os.path.join(tmp_dir,'word/document.xml'), 'w') as f:
            xmlstr = etree.tostring (xml_content, pretty_print=True)
            f.write(xmlstr)

        # Get a list of all the files in the original docx zipfile
        filenames = self.zipfile.namelist()
        # Now, create the new zip file and add all the filex into the archive
        zip_copy_filename = output_filename
        with zipfile.ZipFile(zip_copy_filename, "w") as docx:
            for filename in filenames:
                docx.write(os.path.join(tmp_dir,filename), filename)

        # Clean up the temp dir
        shutil.rmtree(tmp_dir)

Из того, что я могу сказать, этот блок кода записывает xml документ как .docx. Обратитесь к статье для получения дополнительной информации.

0 голосов
/ 16 февраля 2020

Python не лучший инструмент для этого. Используйте VBA, если вам нужно автоматизировать что-либо в документе Word или нескольких документах Word. Я не могу сказать, что вы даже пытаетесь сделать здесь, но давайте начнем с самого начала, с чего-то простого. Если, например, вы хотите l oop пройти по всем абзацам в документе Word и выбрать только уравнения, вы можете выполнить приведенный ниже код, чтобы сделать это.

Sub SelectAllEquations()
Dim xMath As OMath
Dim I As Integer
With ActiveDocument
    .DeleteAllEditableRanges wdEditorEveryone
    For I = 1 To .OMaths.Count
        Set xMath = .OMaths.Item(I)
        xMath.Range.Paragraphs(1).Range.Editors.Add wdEditorEveryone
    Next
    .SelectAllEditableRanges wdEditorEveryone
    .DeleteAllEditableRanges wdEditorEveryone
End With
End Sub

Опять же, я не надену Не знаю, какова ваша конечная игра, но я думаю, что стоит начать с чего-то подобного и опираться на свой фундамент.

...