Удаление таблицы из текстового документа с использованием Docx4j - PullRequest
0 голосов
/ 01 сентября 2018

В моем документе 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 ]

0 голосов
/ 02 сентября 2018

Сначала укажите элемент, который вы хотите удалить (в списке объектов, возвращенных вашим 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();
}
0 голосов
/ 01 сентября 2018

Я использовал этот код в качестве базы.

Рабочий раствор:

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) не смог прочитать результат, только после восстановления.

...