【问题标题】:Deleting table from word document using Docx4j使用 Docx4j 从 Word 文档中删除表格
【发布时间】:2019-02-07 02:33:24
【问题描述】:

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

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

【问题讨论】:

    标签: java docx4j


    【解决方案1】:

    我使用this 代码作为基础。

    一个可行的解决方案:

    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) 无法读取结果,只有在进行恢复之后。

    【讨论】:

    • 我使用了这种方法,但我的表格没有从文档中删除。它仍然存在。我还更改了所有依赖项,但没有用。
    • 嗯。也许您应该共享一个与您想要修改的结构相同的示例文档。
    • 先生,我的 docx 文件类似于:mediafire.com/file/y15ji9hexts72za/Hello.docx/file 它有 02 个无边框的表格。我想删除第二张桌子。谢谢
    • 我的代码删除了第二个,我没有看到你的问题。也许我们正在使用不同的版本。我的是 3.3.0。
    【解决方案2】:

    首先,指定要删除的项目(在 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多