【问题标题】:docx4j: Read data between two bookmarks of docx file using Javadocx4j:使用 Java 读取 docx 文件的两个书签之间的数据
【发布时间】:2019-03-28 08:51:20
【问题描述】:

我正在执行一项任务,我需要使用 Java读取 docx 文件的两个书签之间的数据。 我使用下面的代码使用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 文件书签名称如bookmarkstart1bookmarkend1bookmarkstart2bookmarkend2...等等。 我需要读取bookmarkstart1bookmarkend1 之间的数据。

感谢任何帮助。

.

【问题讨论】:

标签: java docx bookmarks docx4j


【解决方案1】:

像这样。

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);

}

【讨论】:

  • betweenContent 是 List,我如何从该列表中获取数据。
  • 文字内容还是其他?
  • 我需要将此内容保存到另一个文件。如何将内容之间保存到另一个文件。
  • anotherP.getContent().add(betweenContent)
  • 你能把写 betweenContent 数据的代码贴到另一个 docx 文件吗
【解决方案2】:

我以前做过。有我的解决方案:

  1. 你有目标书签开始标签对象CTBookmark start

  2. 可以通过P p = (P) start.getParent()得到它的父对象,它的父对象应该是P的一个实例。

  3. List&lt;Object&gt; content = p.getContent(),获取P标签的内容,你的书签开始标签和结束标签应该在,然后你就可以得到你想要的了。

ps。 P 的内容中的书签标记对象可能是 JAXBElement 的一个实例,您可以使用XmlUtil.unwrap() 强制转换为 CTBookmark。
结束标签与开始标签具有相同的id,记住。

【讨论】:

  • 你能发布你的代码以便更好地理解吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-08
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多