为了账号安全,请及时绑定邮箱和手机立即绑定

使用Docx4j从word文档中删除表格

使用Docx4j从word文档中删除表格

白衣非少年 2021-08-25 11:09:41
我的 Word 文档有两个表,我正在尝试使用以下代码删除最后一个表:public static void removeTable() throws Docx4JException, JAXBException {    File doc = new File("D:\\Hello.docx");    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(doc);    MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();    String xpath = "//w:tbl";    List<Object> list = mainDocumentPart.getJAXBNodesViaXPath(xpath, false);    if(list.size()==2){        Tbl tbl = (Tbl) XmlUtils.unwrap(list.get(list.size()-1));        mainDocumentPart.getContent().remove(tbl.getParent());        wordMLPackage.save(new java.io.File("D:\\Hello.docx"));        System.out.println(list.size());    }}但是我的文档没有发生任何事情。有人可以在这方面帮助我吗?谢谢
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

首先,指定要删除的项目(在 XPath 返回的对象列表中)。


 Object deleteMe = list.get(1);

使用代码:


        Object parent = getParent(deleteMe);

        if (parent instanceof ContentAccessor) {

            boolean result = ((ContentAccessor)parent).getContent().remove(deleteMe);

            System.out.println("Deleted? " + result);

        } else {

            System.out.println("TODO: get content list from " + parent.getClass().getName());               

        }

用一个小帮手方法:


private Object getParent(Object o) {    

    return ((Child)XmlUtils.unwrap(o)).getParent();

}



查看完整回答
反对 回复 2021-08-25
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

我使用此代码作为基础。


一个有效的解决方案:


public class RemoveLastTable {


    public static void main(String[] args) throws Docx4JException {

        File doc = new File("d:\\tmp\\tables.docx");

        WordprocessingMLPackage pkg = WordprocessingMLPackage.load(doc);

        removeLastTable(pkg, "d:\\tmp\\tables_updated.docx");


    }


    public static void removeLastTable(WordprocessingMLPackage wordMLPackage, String outFile) throws Docx4JException {


        Body body = wordMLPackage.getMainDocumentPart().getContents().getBody();

        List<Object> tables = getAllElementFromObject(body, Tbl.class);

        int indexTableToRemove = tables.size() - 1;

        Tbl tableToRemove = (Tbl) tables.get(indexTableToRemove);

        body.getContent().remove(tableToRemove.getParent());

        wordMLPackage.save(new File(outFile));

    }


    private static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {

        List<Object> result = new ArrayList<>();

        if (obj instanceof JAXBElement) {

            obj = ((JAXBElement<?>) obj).getValue();

        }


        if (obj.getClass().equals(toSearch)) {

            result.add(obj);

        }


        if (obj instanceof ContentAccessor) {

            List<?> children = ((ContentAccessor) obj).getContent();

            for (Object child : children) {

                result.addAll(getAllElementFromObject(child, toSearch));

            }


        }

        return result;

    }

}

然而更新文档的保存并不完美,我的Word 2016(Office 365)无法读取结果,只有在进行恢复之后。


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 324 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信