OpenOfficeAPI开发(四)--⽂档接⼝开发实例
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.下的很多类
⽐如:
import com.XTextDocument; //⽂本document类
import com.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 = Controller();
m_xModel = Model();
//UnoRuntime.queryInterface这个是查询你需要的接⼝!这个⽅法很重要,你可以通过这个⽅法,查询到你要操作的接⼝
m_xDoc = (XTextDocument) UnoRuntime.queryInterface(
XTextDocument.class, m_xModel);
//getText()是XTextDocument的⽅法,必须先查到XTextDocument,然后再得到Text接⼝
//最后才能得到上⾯的⽂本⽂字
m_xDocText = Text();
// 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 = ateEnumeration();
//遍历段落
while (xParaEnum.hasMoreElements()) {
Object elements = Element();
XServiceInfo xInfo = (XServiceInfo) UnoRuntime.queryInterface(
XServiceInfo.class,elements );
//从元素对象中查到⽂本⽂字的上下⽂
m_xTextContent = (XTextContent) UnoRuntime.queryInterface(
XTextContent.class, elements);
//得到textrange
m_xTextRange = Anchor();
//测试插⼊注释;
insertAnnotataionToSpeciPosi(m_xDocText, m_xTextRange,3,4);
//得到段落的⽂字
百度api接口
String str = String();
}
} catch (Exception e) {
ErrorLog.writeExceptionToTxt(e);
}
}
/**
* 往指定的位置插⼊注释
*/
public void insertAnnotataionToSpeciPosi(XText _xText,XTextRange _xTextRange, int _paragh, int _offset) {
try {
int i = 1;
//得到⽂本光标
XTextCursor mXTextCursor = _ateTextCursor();
//段落光标
XParagraphCursor xParaCursor = (XParagraphCursor) UnoRuntime.queryInterface(XParagraphCursor.class, mXTextCursor);          //将光标游到指定的段
//            while (i <= _paragh) {
//                NextParagraph(false);
//                i++;
//            }
try{
// StartOfParagraph(true);
// mXTextCursor = ( XTextCursor)UnoRuntime.queryInterface(XTextCursor.class, xParaCursor);
//这⾥要为false才能移动到指定的textrange;
// Start(false);
}
catch(Exception e)
{
ErrorLog.writeExceptionToTxt(e);
}
XTextField xTextField = (XTextField) UnoRuntime.queryInterface(
XTextField.class, ateInstance(
"com.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);
}
}
主要是这两个函数。没有多少注释。没办法。⼿上实在没过多的资料。