2015-03-30 3 views
1

Я пытаюсь удалить абзац из документа .docx, который я создал с помощью Apache poi XWPF. Я могу сделать это легко с документом .doc слово, используя HWPF, как показано ниже:Как удалить абзац с помощью XWPF - Apache POI

for (String paraCount : plcHoldrPargrafDletdLst) { 
     Paragraph ph = doc.getRange().getParagraph(Integer.parseInt(paraCount)); 
     System.out.println("Deleted Paragraph Start & End: " + ph.getStartOffset() +" & " + ph.getEndOffset()); 
     System.out.println("Deleted Paragraph Test: " + ph.text()); 
     ph.delete(); 
    } 

Я попытался сделать то же самое с

doc.removeBodyElement (Integer.parseInt (paraCount));

Но unfortunatley недостаточно удался, чтобы получить результат, как я хочу. В результирующем документе я не вижу, как абзац удален. Любые предложения о том, как сопутствовать подобной функциональности в XWPF.

ответ

1

Похоже, вы действительно не можете удалить абзацы из файла .docx.

То, что вы должны быть в состоянии сделать это удалить содержание пунктов ... Так называемые Runs .Вы могли бы попробовать с этим:

List<XWPFParagraph> paragraphs = doc.getParagraphs(); 

    for (XWPFParagraph paragraph : paragraphs) 
    { 
     for (int i = 0; i < paragraph.getRuns().size(); i++) 
      { 
       paragraph.removeRun(i); 
      } 
    } 

Вы также можете указать, какие Run из которых пункт должен быть удален например

paragraphs.get(23).getRuns().remove(17);

+0

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

+0

Список run = paragraph.getRuns(); \t \t \t \t \t \t XWPFRun r1 = paragraph.createRun(); \t \t \t \t Строка text = paragraph.getText(); \t \t за (XWPFRun r: пробеги) { \t \t r.setText (remplchldr, 0); \t \t} \t \t text = text.replace (xistPlacHoldr, EMPTY_STRING); \t \t r1.setText (текст, 0); – ambi

0

Я считаю, что ваш вопрос был дан в this question.

Когда вы находитесь внутри таблицы вы должны использовать функции XWPFTableCell вместо XWPFDocument:

cell.removeParagraph(cell.getParagraphs().indexOf(para)); 
1

Ok , этот вопрос немного устарел и может не понадобиться, но я нашел другое решение, чем предлагаемое.

Надежда следующий код поможет кому-то с той же проблемой

... 
    FileInputStream fis = new FileInputStream(fileName); 
    XWPFDocument doc = new XWPFDocument(fis); 
    fis.close(); 
    // Find a paragraph with todelete text inside 
    XWPFParagraph toDelete = doc.getParagraphs().stream() 
      .filter(p -> StringUtils.equalsIgnoreCase("todelete", p.getParagraphText())) 
      .findFirst().orElse(null); 
    if (toDelete != null) { 
     doc.removeBodyElement(doc.getPosOfParagraph(toDelete)); 
     OutputStream fos = new FileOutputStream(fileName); 
     doc.write(fos); 
     fos.close(); 
    } 
Смежные вопросы