Есть ли способ удалить разрыв раздела в Word- js? - PullRequest
1 голос
/ 08 апреля 2020

Я пишу надстройку Word с использованием office- js, которая генерирует индекс. Он использует следующий код для создания разрыва раздела в конце документа, а затем записывает туда индекс:

function WriteIndex() {
   Word.run(function (context) {
   //
   var html = GenerateIndex(); // generate the index as an html string
   //
   if (html.length > 0) {
      var body = context.document.body;
      body.insertBreak(Word.BreakType.sectionNext, Word.InsertLocation.end);
      body.select("End"); // put it at the end
      return context.sync().then(function () {
         body = context.document.body;
         body.select("End"); // put it at the end
         body.insertHtml(html, Word.InsertLocation.end);
         return context.sync();
      });
    }).catch(handleError);
} 

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

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

Действительно ли это так, что API позволяет создавать разрывы разделов, но не позволяет их удалять? Кто-нибудь делал что-то подобное раньше? Есть ли лучший подход?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Да, это немного округло, но это можно сделать.

Как вы знаете, фактический разрыв раздела не является частью section.body Range. Таким образом, хитрость заключается в том, чтобы получить точку непосредственно перед этим, в конце диапазона предшествующего раздела, как показано в следующем фрагменте кода. (Проверено в ScriptLab.)

    const doc = context.document;
    const secs = doc.sections;
    secs.load("items");
    await context.sync();

    //console.log(secs.items.length.toString());
    const nrSecs = secs.items.length - 1;
    const sect = secs.items[nrSecs];
    const secPrev = secs.items[nrSecs-1];

    //console.log(sect.isNullObject);

   var sectRng = sect.body.getRange("Content");
   const secStart = secPrev.body.getRange("End");
   var sectAll = secStart.expandTo(sectRng);
   sectAll.delete ();

    await context.sync();
0 голосов
/ 10 апреля 2020

Для дальнейшего использования, вот моя версия js (добавлена ​​в качестве ответа только потому, что код превышает ограничение на количество символов в комментариях - Синди Майстер должна получить кредит за ответ, а не я). Я включил проверку того, существует ли секция индекса в функции, которая вызывает эту функцию, поскольку она обычно не относится к другим:

     function RemoveLastSection() {
    Word.run(function (context) {
        var doc = context.document;
        var secs = doc.sections;
        secs.load("items");
        context.sync().then(function () {
            if (secs.items.length > 1) {
                var nrSecs = secs.items.length - 1;
                var sect = secs.items[nrSecs];
                var secPrev = secs.items[nrSecs - 1];
                var sectRng = sect.body.getRange("Content");
                var secStart = secPrev.body.getRange("End");
                var sectAll = secStart.expandTo(sectRng);
                sectAll["delete"]();
            }
            return context.sync();
        });
        return context.sync();
    }).catch(handleError)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...