docx4j: чтение данных между двумя закладками файла docx с использованием Java - PullRequest
0 голосов
/ 24 октября 2018

Я выполняю задачу, в которой мне нужно прочитать данные между двумя закладками из docx файла, используя Java.Я получил все названия закладок, используя docx4j api, используя приведенный ниже код -

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(file.getPath()));
MainDocumentPart tempDocPart = wordMLPackage.getMainDocumentPart();
List<Object> obj = wordMLPackage.getMainDocumentPart().getContent();

RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");
    new TraversalUtil(obj, rt);
    for (CTBookmark bm : rt.getStarts()) {
        if(bm.getName().equals("bookmarkstart1")){
            System.out.println(bm.getName());

        }
    }

Имя моей docx закладки файла, например bookmarkstart1, bookmarkend1, bookmarkstart2, bookmarkend2... скоро.Мне нужно прочитать данные между bookmarkstart1 и bookmarkend1.

Любая помощь приветствуется.

enter image description here.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

вот так.

private void getConten(WordprocessingMLPackage wordMLPackage){
    MainDocumentPart tempDocPart = wordMLPackage.getMainDocumentPart();
    List<Object> obj = wordMLPackage.getMainDocumentPart().getContent();

    RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");
    new TraversalUtil(obj, rt);
    CTBookmark start = null;
    List<CTMarkupRange> ends = rt.getEnds();
    for (CTBookmark bm : rt.getStarts()) {
        if(bm.getName().equals("targetBookmarkName")){
            start = bm;
            break;
        }
    }
    if(start == null){
        return;
    }
    Object parent = start.getParent();
    if(!( parent instanceof P)){
        return;
    }
    List<Object> content = ((P) parent).getContent();
    int startIndex = -1;
    int endIndex = -1;
    BigInteger startId = start.getId();
    for (int i = 0; i < content.size(); i++) {
        Object o = content.get(i);
        if(o == start){
            startIndex = i;
        }else if(o instanceof CTMarkupRange){
            if(startId.equals(((CTMarkupRange)o).getId())){
                endIndex = i;
                break;
            }
        }else if(o instanceof JAXBElement){
            Object unwrap = XmlUtils.unwrap(o);
            if(unwrap instanceof CTBookmark){
                // start tag
                if(startId.equals(((CTBookmark)unwrap).getId()){
                    startIndex = i;
                }
            }else if(unwrap instanceof CTMarkupRange){
                // end tag
                if(startId.equals(((CTMarkupRange)unwrap).getId())){
                    endIndex = i;
                }
            }
        }
    }
    if(startIndex < 0 || endIndex < 0){
        // content not found
        return;
    }
    List<Object> betweenContent = content.subList(startIndex, endIndex);

}
0 голосов
/ 24 октября 2018

Я делал это раньше.Вот мое решение:

  1. у вас есть целевой объект стартовой метки закладки CTBookmark start.

  2. вы можете получить его родителя по P p = (P) start.getParent(), его родительский объект должен быть экземпляром P.

  3. List<Object> content = p.getContent(), получить содержимоетега P, начальный тег и конечный тег вашей закладки должны быть там, тогда вы можете получить то, что хотите.

пс.объекты тега закладки в содержимом P, возможно, экземпляр JAXBElement, вы можете привести к CTBookmark, используя XmlUtil.unwrap().
конечный тег имеет тот же идентификатор со стартовым тегом, запомните.

...