3.2 电子表格文档的建立和加载
上一节描述的方法帮助我们从服务管理器中获取了com.sun.star.frame.Desktop服务。Desktop可以根据给定的URL来加载新的或者已经存在的组件。为了提供这样的服务,Desktop实现了com.sun.star.frame.XcomponentLoader接口,这个接口只有一个方法根据给定的URL加载和实例化对应的组件。要构建一个新的电子表格文档组件,可以使用“private:factory/scalc”这样的URL。关于更详细的信息请参考OpenOffice.org开发指南《第8章 电子表格》中的8.2.1 “电子表格文档的建立和加载”。
public XComponent getSpreadsheetComponent(Object desktop, String templateURL)
throws Exception
{
XComponentLoader xComponentLoader =
(XComponentLoader)UnoRuntime.queryInterface(XComponentLoader.class, desktop);
PropertyValue[] pPropValues;
pPropValues = new PropertyValue[0];
return xComponentLoader.loadComponentFromURL(templateURL, "_blank",0, pPropValues);
}
下面这个方法将由用户界面所调用,在调用之前用户需要将必要的参数传递给上面代码中描述的方法:
XComponent xSpreadsheetComponent =
oooHelper.getSpreadsheetComponent(desktop, "private:factory/scalc");
接着,我们需要获取电子表格文档对象:
public XSpreadsheetDocument getXSpreadsheetDocument(XComponent xSpreadsheetComponent)
throws Exception
{
return(XSpreadsheetDocument)UnoRuntime.queryInterface
(XSpreadsheetDocument.class, xSpreadsheetComponent);
}
下一个定义的方法,getXSpreadsheet( ),定义如下,这个方法帮助我们精确定位要与哪个电子表格文档进行交互。默认情况下,Calc应用程序在启动的时候就已经建立好了三个电子表。这三个电子表的名称分别是“Sheet1”、“Sheet2”、“Sheet3”,这三个电子表会随着您启动Calc应用程序而打开。如果您将字符串“Sheet1”传递给getXSpreadsheet( )方法,那么接下来您所做的改动都将在“Sheet1”电子表中进行。然而,您或许想要给自定义的电子表起一个不同于默认命名方式的名字。比如说,您将电子表命名为“Javalobby Article
Analyzer”。如果您将这个名字作为参数传递给getXSpreadsheet( )方法,一个以此字符串命名的电子表将被构建。
然而,默认情况下,叫“Sheet1”的电子表仍然是当前电子表,所谓当前电子表就是在应用程序启动时呈现在用户面前的那个电子表。无论您是否新建电子表,默认的三个电子表始终都是存在的。假如您想将您自己定义的电子表设为当前状态,您可以有两种选择。一种是使用在getXSpreadsheet( )方法之后定义的getXActiveSpreadsheet(
)方法,另外您可以直接将默认的三个电子表删除掉,就如下面的getXSpreadsheet( )方法中的一样,而一旦这三个电子表被删除之后也就只剩下您自定义的那个电子表了,所剩的最后一个电子表也就理所当然地成为当前电子表了。
public XSpreadsheet getXSpreadsheet(XSpreadsheetDocument xSpreadsheetDocument, String name)
throws Exception
{
XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
//See section 2.5.2 of the OpenOffice.org API:
xSpreadsheets.insertNewByName(name, (short)0);
Object sheet = xSpreadsheets.getByName(name);
xSpreadsheets.removeByName("Sheet1");
xSpreadsheets.removeByName("Sheet2");
xSpreadsheets.removeByName("Sheet3");
return (XSpreadsheet)UnoRuntime.queryInterface(XSpreadsheet.class, sheet);
}
接下来的方法是如何将电子表设为当前电子表:
public XSpreadsheet getXActiveSpreadsheet(XComponent xSpreadsheetComponent,
XSpreadsheet xSpreadsheet) throws Exception
{
XModel xSpreadsheetModel = (XModel)UnoRuntime.queryInterface(XModel.class,
xSpreadsheetComponent);
XController xSpreadsheetController = xSpreadsheetModel.getCurrentController();
XSpreadsheetView xSpreadsheetView = (XSpreadsheetView)UnoRuntime.
queryInterface(XSpreadsheetView.class, xSpreadsheetController);
xSpreadsheetView.setActiveSheet(xSpreadsheet);
return xSpreadsheet;
}
本文译自NetBeans.org中的文章,其中的代码也都经过译者测试。未完待续!!!