Как я могу извлечь и манипулировать «главами» и «подразделами» текстового документа на основе заголовков? - PullRequest
1 голос
/ 06 февраля 2020

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

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

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

Так есть ли в любом случае с офисом. js для чистого разделения глав / разделов?

1 Ответ

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

Следующий цикл перебирает абзацы и ищет слова со стилем заголовок 1 или заголовок 2 и добавляет их диапазоны в headingRanges [].

headingRanges [] позже зацикливается, и создается новый диапазон, deltaRange, путем расширения каждого диапазона заголовка до начала следующего заголовка. Затем я вывожу текст deltaRange на консоль.

Это разбивает главы с подглавами в них, но если эта функциональность необходима, это не должно быть слишком сложно, чтобы построить поверх этого.

let headings = [];
let headingRanges = [];

Word.run(async context => {
    let paragraphs = context.document.body.paragraphs;

    context.load(paragraphs, ["items"]);
    await context.sync();

    for (let i = 0; i < paragraphs.items.length; ++i) {
        let item = paragraphs.items[i];

        context.load(item, ["text", "style", "styleBuiltIn"]);
        await context.sync();

        if ( item.style === "heading 1" || item.style === "heading 2"){
            //console.log("(" + item.style + ")\n" + item.text);
            headings.push(item.text);
            let itemRange = item.getRange("start");
            itemRange.track();
            headingRanges.push(itemRange);
        }
    }

    for(let i = 0; i < headingRanges.length-1; i++){
        let deltaRange = headingRanges[i].expandTo(headingRanges[i+1]);
        let chapterText = deltaRange.text;
        await context.sync();
        console.log(chapterText);
    }
});

Я сейчас возникли проблемы с отслеживанием диапазонов track () и использованием Word.run () для контекста диапазонов, но я не буду делать для этого отдельную запись.

...