猿问

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

我的 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());

    }

}

但是我的文档没有发生任何事情。有人可以在这方面帮助我吗?谢谢


白衣非少年
浏览 325回答 2
2回答

蝴蝶刀刀

首先,指定要删除的项目(在 XPath 返回的对象列表中)。&nbsp;Object deleteMe = list.get(1);使用代码:&nbsp; &nbsp; &nbsp; &nbsp; Object parent = getParent(deleteMe);&nbsp; &nbsp; &nbsp; &nbsp; if (parent instanceof ContentAccessor) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boolean result = ((ContentAccessor)parent).getContent().remove(deleteMe);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Deleted? " + result);&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("TODO: get content list from " + parent.getClass().getName());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }用一个小帮手方法:private Object getParent(Object o) {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; return ((Child)XmlUtils.unwrap(o)).getParent();}

侃侃尔雅

我使用此代码作为基础。一个有效的解决方案:public class RemoveLastTable {&nbsp; &nbsp; public static void main(String[] args) throws Docx4JException {&nbsp; &nbsp; &nbsp; &nbsp; File doc = new File("d:\\tmp\\tables.docx");&nbsp; &nbsp; &nbsp; &nbsp; WordprocessingMLPackage pkg = WordprocessingMLPackage.load(doc);&nbsp; &nbsp; &nbsp; &nbsp; removeLastTable(pkg, "d:\\tmp\\tables_updated.docx");&nbsp; &nbsp; }&nbsp; &nbsp; public static void removeLastTable(WordprocessingMLPackage wordMLPackage, String outFile) throws Docx4JException {&nbsp; &nbsp; &nbsp; &nbsp; Body body = wordMLPackage.getMainDocumentPart().getContents().getBody();&nbsp; &nbsp; &nbsp; &nbsp; List<Object> tables = getAllElementFromObject(body, Tbl.class);&nbsp; &nbsp; &nbsp; &nbsp; int indexTableToRemove = tables.size() - 1;&nbsp; &nbsp; &nbsp; &nbsp; Tbl tableToRemove = (Tbl) tables.get(indexTableToRemove);&nbsp; &nbsp; &nbsp; &nbsp; body.getContent().remove(tableToRemove.getParent());&nbsp; &nbsp; &nbsp; &nbsp; wordMLPackage.save(new File(outFile));&nbsp; &nbsp; }&nbsp; &nbsp; private static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {&nbsp; &nbsp; &nbsp; &nbsp; List<Object> result = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; if (obj instanceof JAXBElement) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj = ((JAXBElement<?>) obj).getValue();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if (obj.getClass().equals(toSearch)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.add(obj);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if (obj instanceof ContentAccessor) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<?> children = ((ContentAccessor) obj).getContent();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (Object child : children) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.addAll(getAllElementFromObject(child, toSearch));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return result;&nbsp; &nbsp; }}然而更新文档的保存并不完美,我的Word 2016(Office 365)无法读取结果,只有在进行恢复之后。
随时随地看视频慕课网APP

相关分类

Java
我要回答