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

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

my_img

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

Пожалуйста, помогите мне, как это сделать. Я пытался использовать 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);
}

person Liquidpie    schedule 23.02.2014    source источник
comment
Вы можете найти полный пример кода в этом вопросе, что немного похоже на ваше.   -  person DenisFLASH    schedule 21.07.2014


Ответы (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 );
}

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

person DenisFLASH    schedule 20.07.2014
comment
Или вы также можете сохранить порядок цикла и всегда удалять из startIndex вместо i. - person Guga; 04.02.2016