您的位置:首页 > 运维架构

OpenOffice API开发 (四)--文档接口开发实例

2014-01-05 21:48 423 查看
OOOsdk api 文档部分接口开发;

这里建立一个java类文件,名为;OpenOfficeContext 这个类主要是获取OpenOffice提供的文档接口,其实用win32术语来讲就是获得操作openoffice 文档 的句柄。有了这些句柄,就可以操作文档内容了。这些具体术语,不好意思,实在记不清了;

首先,复制一些需要引入的类文件:

import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XServiceInfo;


这几个显示的是必须引入的,这个是OOO与API 打交道的接口。

因为该例子是文档类型,所以要引入的com.sun.star.text.下的很多类

比如:

import com.sun.star.text.XTextDocument; //文本document类

import com.sun.star.text.XTextCursor; //文本光标类


等。如果不知道要引入那些,偷懒的方法是找到sdk目录下的样例中的样例程序文件。拷贝过来就是了。

其实将白了,个人感觉做SDK开发,一定要看sdk提供的样例,我们大部分的开发都是在这些样例上进行增改!

在openofficeContext构造函数中

需要传入两参数。

_xComponentContext 这个是组件上下文接口

这个参数我们不用担心从哪里获得,此接口由OOO分发过来。

在ProtocolHandlerAddon.java的ProtocolHandlerAddonImpl(XComponentContext xComponentContext )中获得了。

m_xCmpCtx = xComponentContext;;

xFrame 这个是和主框架提供给插件的接口

这个也不用担心,在ProtocolHandlerAddon.java的initialize()方法中也获得了;

if ( object.length > 0 )

{

m_xFrame = ( XFrame )UnoRuntime.queryInterface(

XFrame.class, object[ 0 ]);

}

public OpenOfficeContext(XComponentContext _xComponentContext, XFrame _xFrame) {
try {
m_xCmpCtx = _xComponentContext;
m_xFrame = _xFrame;
//以下从xframe中获得控制器,又从控制器中取得model,
//主要就是为了 从Xmodel中去查询到XTextDocument文档接口
//这个过程一般都是一样的
m_xController = m_xFrame.getController();
m_xModel = m_xController.getModel();
//UnoRuntime.queryInterface这个是查询你需要的接口!这个方法很重要,你可以通过这个方法,查询到你要操作的接口
m_xDoc = (XTextDocument) UnoRuntime.queryInterface(
XTextDocument.class, m_xModel);
//getText()是XTextDocument的方法,必须先查到XTextDocument,然后再得到Text接口
//最后才能得到上面的文本文字
m_xDocText = m_xDoc.getText();
// m_xDocFactory是文本文档操作非常重要的一个接口,顾名思义,其实文本操作的工厂接口类;
m_xDocFactory = (XMultiServiceFactory) UnoRuntime.queryInterface(
XMultiServiceFactory.class, m_xDoc);
}
catch (Exception e) {
ErrorLog.writeExceptionToTxt(e);
}
}
程序中一个方法就是往文本中插入注释。和word中插入批注一样;

下面是具体实现函数;

/**
* 测试,往文本中的每一段处插入注释,并得到每一段文字
*/
public void insertannotation() {
try {
//从m_xDocText接口中查询到列举动作的许可
XEnumerationAccess xParaAccess = (XEnumerationAccess) UnoRuntime.queryInterface(XEnumerationAccess.class, m_xDocText);
//创建枚举器
XEnumeration xParaEnum = xParaAccess.createEnumeration();
//遍历段落
while (xParaEnum.hasMoreElements()) {
Object elements = xParaEnum.nextElement();
XServiceInfo xInfo = (XServiceInfo) UnoRuntime.queryInterface(
XServiceInfo.class,elements );
//从元素对象中查到文本文字的上下文
m_xTextContent = (XTextContent) UnoRuntime.queryInterface(
XTextContent.class, elements);
//得到textrange
m_xTextRange = m_xTextContent.getAnchor();
//测试 插入注释;
insertAnnotataionToSpeciPosi(m_xDocText, m_xTextRange,3,4);
//得到段落的文字
String str = m_xTextRange.getString();

}
} catch (Exception e) {
ErrorLog.writeExceptionToTxt(e);
}
}


/**
* 往指定的位置插入注释
*/
public void insertAnnotataionToSpeciPosi(XText _xText,XTextRange _xTextRange, int _paragh, int _offset) {
try {
int i = 1;
//得到文本光标
XTextCursor mXTextCursor = _xText.createTextCursor();
//段落光标
XParagraphCursor xParaCursor = (XParagraphCursor) UnoRuntime.queryInterface(XParagraphCursor.class, mXTextCursor);
//将光标游到指定的段
//            while (i <= _paragh) {
//                xParaCursor.gotoNextParagraph(false);
//                i++;
//            }
try{
// xParaCursor.gotoStartOfParagraph(true);
// mXTextCursor = ( XTextCursor)UnoRuntime.queryInterface(XTextCursor.class, xParaCursor);

//这里要为false才能移动到指定的textrange;
mXTextCursor.gotoRange(_xTextRange,false);
// mXTextCursor.gotoStart(false);
mXTextCursor.goRight((short)_offset, false);
}
catch(Exception e)
{
ErrorLog.writeExceptionToTxt(e);
}
XTextField xTextField = (XTextField) UnoRuntime.queryInterface(
XTextField.class, m_xDocFactory.createInstance(
"com.sun.star.text.TextField.Annotation"));
XPropertySet xTextFieldPropertySet = (XPropertySet)UnoRuntime.queryInterface(
XPropertySet.class, xTextField);
// set the appropriate properties for character and paragraph style
xTextFieldPropertySet.setPropertyValue("Author", "chenqiang");
xTextFieldPropertySet.setPropertyValue("Content", "hello sdk");
_xText.insertTextContent(mXTextCursor, xTextField, false);
} catch (Exception e) {
ErrorLog.writeExceptionToTxt(e);
}
}


主要是这两个函数。没有多少注释。没办法。手上实在没过多的资料。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: