Как перезагрузить верхний и нижний колонтитулы в MS Word с помощью officejs api - PullRequest
0 голосов
/ 22 мая 2018

Я получаю документ в формате ooxml от BE с использованием этого метода (и xml из BE содержит весь документ с верхним и нижним колонтитулом (если они существуют)):

public someGetMethod(templateId: string): ng.IPromise<Template[]> {
    return this.Service.getXml(templateId)
        .then((myBodyXML: string) => {
            return Word.run((...args) => {
                const context = args[0];
                const body = context.document.body;
                body.insertOoxml(myBodyXML, Word.InsertLocation.replace);

                return context.sync();
            })
                .catch((error: Error) => {
                    console.error('Error: ' + JSON.stringify(error));
                });
        });
}

Это прекрасно работает.

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

Да, это нормально, потому что яиспользуйте body.insertOoxml() и в соответствии с документацией тело не содержит верхнего и нижнего колонтитула (, но как и почему они были загружены в первый раз и не перезагружаются во второй раз? ).

Я попытался таким образом получить верхний и нижний колонтитулы и очистить его или загрузить пустой текст или ooxml, прежде чем выбрать следующий шаблон для загрузки:

const mySections = context.document.sections;
context.load(mySections);
return context.sync().then(() => {
    myHeader = mySections.items[0].getHeader('primary');
    myHeader.insertOoxml(myBodyXML, Word.InsertLocation.replace);
    // or
    myHeader.clear();
    // or
    myHeader.insertText('', Word.InsertLocation.replace);
    return context.sync();
});

, но результатто же самое.

Итак, подводя итог, кто-нибудь может ответить, пожалуйста, как перезагрузить без боли перезагрузки всего документа?

1 Ответ

0 голосов
/ 30 мая 2018

Спасибо за вопрос и, пожалуйста, добавьте больше деталей к нему.Наличие номера сборки вашего Office очень поможет, спасибо за предоставление его в Github.Я знаю, что вы находитесь в версии Word, которая поддерживает только набор требований Word.js 1.1, поэтому код может быть проще в новых сборках, а пока терпите меня.Также в этом случае также очень полезно, если вы можете добавить ссылку на полезную нагрузку OOXML, которую вы вставляете, если вы можете добавить эти детали, это поможет нам более эффективно помогать вам.

Как было сказано, путь кРешите, что ваш сценарий состоит в том, чтобы иметь 3 OOXML-фрагмента: один для тела документа, другой для тела заголовка и еще один для тела нижнего колонтитула. Эти 3 операции выполняются отдельно.

Вот несколько фактов, которыеобъясните, как работает API, объясните, почему вы должны использовать этот подход, и, вероятно, направьте вас в правильном направлении.

  1. Прежде всего, body.insertOoxml () по своему дизайну не заменит существующие заголовки/ footers в документе, и то же самое верно для метода body.insertFileFromBase64 ().Операция влияет только на тело документа.Другими словами, по замыслу, если подлежащий вставке OOXML содержит определения верхних и нижних колонтитулов, для защиты текущего документа они будут игнорироваться, а не переопределять существующие.Вот пример скриптовой лаборатории (и кстати иди сюда , чтобы узнать, как использовать скриптовую лабораторию), который демонстрирует этот факт.Обратите внимание на вставляемую мной разметку OOXML, она содержит определения верхнего и нижнего колонтитула, и они не вставляются в документ после вызова document.body.insertOoxml ()

  2. Верхние и нижние колонтитулы считаются отдельными элементами тела (фактически в формате файла это отдельные документы, известные как «вложенные документы»).Таким образом, чтобы вставить туда OOXML, вам понадобятся отдельные фрагменты OOXML для каждого, что-то вроде

mySections.items[0].getHeader("primary").insertOoxml(ooXmlHeader, "replace");
return context.sync()
Наконец, очистив верхние и нижние колонтитулы, я думаю, что вы следуете правильному подходу, просто убедитесь, что вы пересекаете все разделы в документе, вот пример лабораторной работы , показывающий, как это сделать.

Надеюсь, это полезно.

...