Обновление полей в MS Word с помощью Python - PullRequest
2 голосов
/ 21 октября 2019

Я работаю над программой на Python, которой нужно добавлять тексты подписей в MS Word в рисунки и таблицы (с нумерацией). Однако после добавления поля оно не появляется в моем Word-документе до тех пор, пока я не обновлю поле (это просто пустое место в моем документе, пока я не обновлю поле, а затем оно перейдет, например, к «2»).

Это мой код для добавления поля:

def add_caption_number(self, field_code):
    """ Add a caption number for the field

        :argument
            field_code: [string] the type of field e.g. 'Figure', 'Table'...
    """
    # Set the pointer to the last paragraph (e.g. the 'Figure ' caption text)
    run = self.last_paragraph.add_run()
    r = run._r

    # Add a Figure Number field xml element
    fldChar = OxmlElement("w:fldChar")
    fldChar.set(qn("w:fldCharType"), "begin")
    r.append(fldChar)

    instrText = OxmlElement("w:instrText")
    instrText.text = " SEQ %s \* ARABIC" % field_code
    r.append(instrText)

    fldChar = OxmlElement("w:fldChar")
    fldChar.set(qn("w:fldCharType"), "end")
    r.append(fldChar)

self.last_paragraph - это последний добавленный абзац, а field code предназначен для выбора добавления подписи к рисунку или таблице.


Я нашел пример для обновления полей, но при открытии документа открывается следующее окно:

def update_fields(save_path):
    """ Automatically updates the fields when opening the word document """
    namespace = "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}"
    doc = DocxTemplate(save_path)

    element_updatefields = lxml.etree.SubElement(
        doc.settings.element, f"{namespace}updateFields"
    )
    element_updatefields.set(f"{namespace}val", "true")

    doc.save(save_path)

Popup window


Есть ли способ сделать это без всплывающего окна и без добавления макросов в документ Word? Это должно работать на MacOS и Windows между прочим.

Любая помощь будет принята с благодарностью! :)

1 Ответ

0 голосов
/ 21 октября 2019

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

Мне известны только три способа предотвращения отображения приглашения

  1. . Рассчитайте значения и вставьтерезультат поля при генерации документа. Поля будут по-прежнему обновляться, как обычно, но не требуют обновления при первом открытии документа. (Оставьте код во второй части вопроса.)

  2. Используйте Word Automation Services (требуется локальный SharePoint), чтобы открыть документ, который обновит поля (как ввторая часть вопроса).

  3. Включить проект VBA, который выполняет обновление поля в макросе AutoOpen. Это, конечно, означает, что тип документа должен быть с поддержкой макросов (docm), и что макросы могут выполняться в целевой установке (конечно, это также угроза безопасности).

...