Как удалить таблицы и абзацы, содержащие данные из docx в java, используя apache poi

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

my_img

Мне нужно удалить эти таблицы и абзацы. Как вы можете видеть на изображении, мне нужно удалить таблицу 2 и ее параграф таблицы абзаца

Пожалуйста, помогите мне, как это сделать. Я пытался использовать document.removeBodyElement(pos), но это не помогает.

int startIndex = 0;
int endIndex = 0;
startIndex = doc.getPosOfTable(doc.getTables().get(0));
startIndex++;
endIndex = doc.getPosOfTable(doc.getTables().get(1));
System.out.println("startIndex "+ startIndex);
System.out.println("endIndex "+ endIndex);

for(int i=startIndex; i<=endIndex; i++){
    doc.removeBodyElement(i);
}

1 ответ

Решение

Проблема в том, что с помощью removeBodyElement сдвигает остальные элементы и пересчитывает их показатели. Это означает, что если вы хотите удалить элементы с № 4 по № 6 (включается пустой абзац между двумя таблицами), то после удаления элемента № 4 (пустая строка) это ваша вторая таблица (а не абзац заголовка), которая станет элементом #5 и т. д. По сути, этот цикл переходит на два элемента (i+=2 вместо i++), таким образом удаляя только половину того, что вы хотите, и даже удаляя то, что вы не хотите удалять.

Таким образом, вам нужно просто изменить порядок вашего цикла:

for ( int i = endIndex; i >= startIndex; i-- ) {
    System.out.println( "removing bodyElement #" + i );
    document.removeBodyElement( i );
}

Я протестировал его с помощью шаблона, похожего на ваш пример, он отлично работает! Надеюсь, поможет.

Другие вопросы по тегам