我正在执行一项任务,其中需要使用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
文件书签名称,例如bookmarkstart1
,bookmarkend1
,bookmarkstart2
,bookmarkend2
...,依此类推。
我需要读取bookmarkstart1
和bookmarkend1
之间的数据。
答案 0 :(得分:0)
我以前做过。有我的解决方案:
您已经有了目标书签开始标记对象CTBookmark start
。
您可以通过P p = (P) start.getParent()
获取其父对象,其父对象应该是P的实例。
List<Object> content = p.getContent()
,获取P标签的内容,书签的开始标签和结束标签都应该在其中,然后您可以获得想要的东西。
ps。 P内容中的书签标签对象可能是JAXBElement的实例,可以使用XmlUtil.unwrap()
强制转换为CTBookmark。
请记住,结束标签与开始标签具有相同的ID。
答案 1 :(得分:-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);
}