如何使用XWPF删除的段落 - Apache的POI(How to delete a paragr

2019-10-22 10:20发布

我想删除我已经使用Apache POI XWPF产生的.docx文档段落。 我可以使用HWPF下面为.doc word文档很容易做到这一点:

    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 accompolish类似功能的任何建议。

Answer 1:

好吧,这个问题是有点老了,可能不再被需要的,但我只是找到比建议的一个不同的解决方案。

希望下面的代码将帮助别人有同样的问题

    ...
    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();
    }


Answer 2:

好像你真的无法从一个.docx文件中删除的段落。

什么,你应该能够做的就是消除段落的内容......所谓的Runs 。你可以用这一个尝试:

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

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

您还可以指定运行的第一款应除去如

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



Answer 3:

版权所有

// Remove all existing runs
removeRun(para, 0);

public static void removeRun(XWPFParagraph para, int depth)
{
    if(depth > 10)
    {
        return;
    }

    int numberOfRuns = para.getRuns().size();

    // Remove all existing runs
    for(int i = 0; i < numberOfRuns; i++)
    {
        try
        {
            para.removeRun(numberOfRuns - i - 1);
        }
        catch(Exception e)
        {
            //e.printStackTrace();
        }
    }

    if(para.getRuns().size() > 0)
    {
        removeRun(para, ++depth);
    }
}


Answer 4:

我相信你的问题是在回答这个问题。

当你的表里面,你需要使用的功能XWPFTableCell代替XWPFDocument

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


文章来源: How to delete a paragraph using XWPF - Apache POI