首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用UNO遍历OpenOffice/LibreOffice中的整个文档

如何使用UNO遍历OpenOffice/LibreOffice中的整个文档
EN

Stack Overflow用户
提问于 2021-10-08 18:14:42
回答 1查看 147关注 0票数 1

我正在编写java代码来访问在Libre Office中打开的文档。

现在,我需要编写一些迭代整个文档的代码,希望按照编辑器中显示的顺序进行迭代。

我可以使用这段代码来遍历所有的普通文本:

代码语言:javascript
运行
复制
XComponent writerComponent=xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0, loadProps);
XTextDocument mxDoc=UnoRuntime.queryInterface(XTextDocument.class, writerComponent);
XText mxDocText=mxDoc.getText();
XEnumerationAccess xParaAccess = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, mxDocText);
XEnumeration xParaEnum = xParaAccess.createEnumeration();
Object element = xParaEnum.nextElement();
while (xParaEnum.hasMoreElements()) {
   XEnumerationAccess inlineAccess = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, element);
   XEnumeration inline = inlineAccess.createEnumeration();
   // And I can then iterate over this inline element and get all the text and formatting.
}

但问题是,这不包括任何图表对象。

然后我可以用

代码语言:javascript
运行
复制
XDrawPagesSupplier drawSupplier=UnoRuntime.queryInterface(XDrawPagesSupplier.class, writerComponent);
XDrawPages pages=drawSupplier.getDrawPages();
XDrawPage drawPage=UnoRuntime.queryInterface(XDrawPage.class,page);
            
for(int j=0;j!=drawPage.getCount();j++) {
   Object sub=drawPage.getByIndex(j);
   XShape subShape=UnoRuntime.queryInterface(XShape.class,sub);
   // Now I got my subShape, but how do I know its position, relative to the text.
}

这给了我所有的图表(和我猜的其他数字),但问题是:如何找出这些图表相对于模型中文本的位置。我如何得到一个光标,它代表每一个图表?

更新:我现在正在为我的XShape寻找一个锚,但是XShape没有一个getAnchor()方法。

但如果我使用prop=UnoRuntime.queryInterface(XPropertySet.class,形状的XPropertySet );

我拿到道具课了。

我称prop.getPropertyValue("AnchorType")为ancher类型的TextContentAnchorType.AS_CHARACTER

但我就是找不到锚本身。没有锚或斜纹属性。

顺便说一句:我试着为libre office安装"MRI“,但我找到的唯一版本是hav libreoffice 3.3作为支持的版本,它不会安装在7.1版上。

-更新2-我设法让它运转起来原来我的XShape也实现了XTextContent (谢谢核磁共振),所以我所要做的就是:

代码语言:javascript
运行
复制
XTextContent subContent=UnoRuntime.queryInterface(XTextContent.class,subShape);
XTextRange anchor=subContent.getAnchor();
XTextCursor cursor = anchor.getText().createTextCursorByRange(anchor.getStart());
cursor.goRight((short)50,true);
System.out.println("String=" + cursor.getString());

这给了我一个指向段落的光标,然后我可以向前/向后移动,找出形状在哪里。因此,这个println调用将打印XShape后面的50个字符。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-09 23:01:31

如何找出这些图表相对于模型中文本的位置。我如何得到一个光标,它代表每一个图表?

摘要注释

锚定对象到特定位置。该形状是否有一个方法getAnchor()或属性AnchorType?我会使用像MRI这样的内省工具来确定这一点。从https://github.com/hanya/MRI/releases下载MRI 1.3.4。

就光标而言,它可能类似于表:

代码语言:javascript
运行
复制
oText = oTable.getAnchor().getText()
oCurs = oText.createTextCursor()

OP给出的代码解决方案

代码语言:javascript
运行
复制
XTextContent subContent=UnoRuntime.queryInterface(XTextContent.class,subShape);
XTextRange anchor=subContent.getAnchor();
XTextCursor cursor = anchor.getText().createTextCursorByRange(anchor.getStart());
cursor.goRight((short)50,true);
System.out.println("String=" + cursor.getString());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69500141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档