3.2 電子表格文檔的建立和加載
上一節(jié)描述的方法幫助我們從服務(wù)管理器中獲取了com.sun.star.frame.Desktop服務(wù)。Desktop可以根據(jù)給定的URL來加載新的或者已經(jīng)存在的組件。為了提供這樣的服務(wù),Desktop實(shí)現(xiàn)了com.sun.star.frame.XcomponentLoader接口,這個接口只有一個方法根據(jù)給定的URL加載和實(shí)例化對應(yīng)的組件。要構(gòu)建一個新的電子表格文檔組件,可以使用“private:factory/scalc”這樣的URL。關(guān)于更詳細(xì)的信息請參考OpenOffice.org開發(fā)指南《第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);
}
下面這個方法將由用戶界面所調(diào)用,在調(diào)用之前用戶需要將必要的參數(shù)傳遞給上面代碼中描述的方法:
XComponent xSpreadsheetComponent =
oooHelper.getSpreadsheetComponent(desktop, "private:factory/scalc");
接著,我們需要獲取電子表格文檔對象:
public XSpreadsheetDocument getXSpreadsheetDocument(XComponent xSpreadsheetComponent)
throws Exception
{
return(XSpreadsheetDocument)UnoRuntime.queryInterface
(XSpreadsheetDocument.class, xSpreadsheetComponent);
}
下一個定義的方法,getXSpreadsheet( ),定義如下,這個方法幫助我們精確定位要與哪個電子表格文檔進(jìn)行交互。默認(rèn)情況下,Calc應(yīng)用程序在啟動的時候就已經(jīng)建立好了三個電子表。這三個電子表的名稱分別是“Sheet1”、“Sheet2”、“Sheet3”,這三個電子表會隨著您啟動Calc應(yīng)用程序而打開。如果您將字符串“Sheet1”傳遞給getXSpreadsheet( )方法,那么接下來您所做的改動都將在“Sheet1”電子表中進(jìn)行。然而,您或許想要給自定義的電子表起一個不同于默認(rèn)命名方式的名字。比如說,您將電子表命名為“Javalobby Article
Analyzer”。如果您將這個名字作為參數(shù)傳遞給getXSpreadsheet( )方法,一個以此字符串命名的電子表將被構(gòu)建。
然而,默認(rèn)情況下,叫“Sheet1”的電子表仍然是當(dāng)前電子表,所謂當(dāng)前電子表就是在應(yīng)用程序啟動時呈現(xiàn)在用戶面前的那個電子表。無論您是否新建電子表,默認(rèn)的三個電子表始終都是存在的。假如您想將您自己定義的電子表設(shè)為當(dāng)前狀態(tài),您可以有兩種選擇。一種是使用在getXSpreadsheet( )方法之后定義的getXActiveSpreadsheet(
)方法,另外您可以直接將默認(rèn)的三個電子表刪除掉,就如下面的getXSpreadsheet( )方法中的一樣,而一旦這三個電子表被刪除之后也就只剩下您自定義的那個電子表了,所剩的最后一個電子表也就理所當(dāng)然地成為當(dāng)前電子表了。
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);
}
接下來的方法是如何將電子表設(shè)為當(dāng)前電子表:
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中的文章,其中的代碼也都經(jīng)過譯者測試。未完待續(xù)!!!