1.引言
許多商業(yè)應(yīng)用程序允許用戶在應(yīng)用程序中生成基于某些數(shù)據(jù)的報(bào)表。電子表格特別適合用于生成這樣的報(bào)表。電子表格不僅可以將數(shù)據(jù)經(jīng)格式化以后以結(jié)構(gòu)化的形式展現(xiàn)給用戶,而且為用戶提供了快速且高效的數(shù)據(jù)處理功能。正如上面所說(shuō)的,OpenOffice.org的API提供了大量的類和方法以方便開(kāi)發(fā)者將OpenOffice.org電子表格的功能集成到他們自己的應(yīng)用程序中。在應(yīng)用程序中,單擊某個(gè)按鈕就可以啟動(dòng)OpenOffice.org并將應(yīng)用程序生成的數(shù)據(jù)以自定義電子表格的形式展現(xiàn)出來(lái)。
新手可能就這個(gè)開(kāi)發(fā)領(lǐng)域很自然地提出一個(gè)問(wèn)題:“一旦開(kāi)發(fā)者正確地安裝了所有需要的軟件后,一個(gè)應(yīng)用程序如何啟動(dòng)OpenOffice.org的新實(shí)例以及如何獲取連接呢?”。這個(gè)問(wèn)題得到了需要的回答之后,開(kāi)發(fā)者還可能提出:“現(xiàn)在用戶應(yīng)用程序已經(jīng)獲取了OpenOffice.org的連接,那么應(yīng)用程序應(yīng)該如何將這些數(shù)據(jù)嵌入到電子表格中呢?”。在這篇文章中,我們將首先著重滿足不熟悉OpenOffice.org的API的開(kāi)發(fā)者的兩個(gè)基本的需求。我們將向開(kāi)發(fā)者展示如何獲取到OpenOffice.org的連接,如何將應(yīng)用程序的數(shù)據(jù)轉(zhuǎn)化為電子表格形式的數(shù)據(jù)。接著我們將討論一些其他的主題,這些主題包括以編程方式構(gòu)建和析構(gòu)電子表格、設(shè)置電子表格的單元格的背景顏色以及單元格邊框的格式化。然而,這里需要注意的是我們只關(guān)注OpenOffice.org本身的集成,為了代碼的可讀性我們忽略了諸如錯(cuò)誤處理之類的問(wèn)題。在這篇文章的結(jié)尾,您將對(duì)OpenOffice.org的API處理電子表格和如何在您自己的應(yīng)用程序中利用它們的相關(guān)知識(shí)有所了解。
這篇文章涉及的應(yīng)用程序是基于Swing的應(yīng)用程序,它通過(guò)使用OpenOfiice.org的API來(lái)訪問(wèn)OpenOffice.org的各種功能。當(dāng)然,您也可以使用C++或者COM/DCOM技術(shù)來(lái)連接OpenOffice.org。此類應(yīng)用程序的代碼并不一定必須基于Swing來(lái)編寫(xiě)。這樣的應(yīng)用程序可以使用C++、Java servlet、Java Server Page、JavaScript、VBScript、Delphi以及Visual Basic來(lái)編寫(xiě)。這篇文章中使用的基于Swing的應(yīng)用程序?qū)⑹褂肗etBeans IDE來(lái)構(gòu)建,并且使用NetBeans Platform作為起始點(diǎn)。盡管任何集成開(kāi)發(fā)工具都可以被用來(lái)構(gòu)建如此簡(jiǎn)單的應(yīng)用程序,但是使用NetBeans進(jìn)行開(kāi)發(fā)具有兩項(xiàng)優(yōu)勢(shì)。首先,在NetBeans中我們可以充分發(fā)揮GUI構(gòu)建器(即Matisse)的功能來(lái)構(gòu)建用戶界面,GUI構(gòu)建器可以幫助我們快速建立應(yīng)用程序界面的原型。其次,將我們的應(yīng)用程序基于NetBeans Platform意味著我們不需要再重頭開(kāi)始,而且我們可以通過(guò)其提供的模塊框架來(lái)增強(qiáng)應(yīng)用程序的可擴(kuò)展性。這個(gè)應(yīng)用程序?qū)⑸扇缦聢D所示的不需要任何后期處理的電子表格文檔:
截圖/o_intro-oo.jpg)
電子表格中的數(shù)據(jù)來(lái)自于JTable組件。在現(xiàn)實(shí)情況下,這些數(shù)據(jù)往往來(lái)源于數(shù)據(jù)庫(kù)中。在上面述及的應(yīng)用程序中,我們將把數(shù)據(jù)硬編碼在程序代碼中,這主要是因?yàn)閿?shù)據(jù)的來(lái)源問(wèn)題已經(jīng)超出本篇文章的范圍了。無(wú)論數(shù)據(jù)是否是來(lái)自于數(shù)據(jù)庫(kù),當(dāng)用戶已經(jīng)完成了數(shù)據(jù)的處理后,應(yīng)用程序?qū)袹Table中的數(shù)據(jù)轉(zhuǎn)換生成電子表格來(lái)呈現(xiàn)。除了數(shù)據(jù)之外,上面的圖還展示了以下幾個(gè)元素,這些元素將在下面的章節(jié)中述及:
表頭,電子表格有一行使用特殊顏色(深藍(lán)色)標(biāo)識(shí)的表頭。
行顏色的交錯(cuò),電子表格中的其他行的顏色是交錯(cuò)的,有的背景色是桔色,而有的是白色。
高或者低的回復(fù),最后一列展示了某篇文章相關(guān)的回復(fù)數(shù)量,回復(fù)量比較高的行的背景顏色是綠色,而回復(fù)量比較低的行的背景顏色是紅色,另外,在主表格的下方的兩個(gè)單元格分別使用相同的顏色來(lái)標(biāo)識(shí)高或者低回復(fù)文章的作者。
回復(fù)的總數(shù),“Reply”列的最后一行的下方的單元格顯示了總回復(fù)數(shù),這個(gè)單元格的格式與其他的單元格不太一樣,總回復(fù)數(shù)是通過(guò)OpenOffice.org的API來(lái)使用Calc的公式計(jì)算得到的。
電子表格名稱,在上面圖形的左下角,您可以看到“Javalobby Analysis”這樣的名稱,而您并沒(méi)有看到Calc打開(kāi)時(shí)的默認(rèn)的電子表(名稱為“Sheet1”、“Sheet2”、“Sheet3”),如下文所闡述的,電子表的名稱的更改和默認(rèn)電子表的移除都可以使用編程方式來(lái)實(shí)現(xiàn)。
這篇文章被分為三部分,這三部分按順序描述了開(kāi)發(fā)的過(guò)程:
簡(jiǎn)化重復(fù)的編碼任務(wù),這一節(jié)中我們將了解OpenOffice.org的API中可復(fù)用的元素,而這些元素將在后面的章節(jié)中被集成到我們的應(yīng)用程序中。
建立用戶界面原型,為了測(cè)試最后一節(jié)中的業(yè)務(wù)邏輯,我們將構(gòu)建Swing應(yīng)用程序的原型。
集成輔助性方法,應(yīng)用程序的核心是將輔助性方法和用戶界面集成起來(lái),并且執(zhí)行計(jì)算,生成電子表格。
2.系統(tǒng)需求
在開(kāi)始之前,請(qǐng)先確認(rèn)以下的軟件已經(jīng)安裝好了:
OpenOffice.org,盡管這篇文章中的代碼也兼容Star Office,但是因?yàn)槲覀兪褂肙penOffice.org的API相關(guān)的JAR文件,所以最好是安裝OpenOffice.org。我們將使用在OpenOffice.org的安裝目錄下的四個(gè)JAR文件,您可以在OpenOffice.org 2.0\program\classes文件夾中找到以下四個(gè)JAR文件:juh.jar、jurt.jar、ridl.jar和unoil.jar。
NetBeans IDE,這篇文章關(guān)注的是OpenOffice.org的API,其中討論的代碼可以使用很多種編程語(yǔ)言描述,可以供多種語(yǔ)言編寫(xiě)的應(yīng)用程序使用。如果您想構(gòu)建這篇文章中描述的基于Swing的應(yīng)用程序,您就需要去下載NetBeans 5.0或者更高的版本。
注意:這篇文章中展現(xiàn)的應(yīng)用場(chǎng)景并不需要使用OpenOffice.org SDK。如果我們要使用SDK中的idlc或者javamaker等工具,那么這個(gè)時(shí)候才需要SDK。
3.背景知識(shí):簡(jiǎn)化重復(fù)的編碼工作
當(dāng)我們使用OpenOffice.org的API工作時(shí),我們可能會(huì)重復(fù)地執(zhí)行某些任務(wù)。比如說(shuō),我們?cè)O(shè)置電子表格表頭的顏色,但是同時(shí)我們也需要設(shè)置其他各行的顏色。實(shí)際上,我們經(jīng)常交替地設(shè)置各行的顏色,這樣可以使得電子表格中的行更容易分辨。如果某篇文章的回復(fù)數(shù)比較高,我們會(huì)將對(duì)應(yīng)的行設(shè)置為不同的顏色(綠色),而回復(fù)數(shù)比較低的行也被設(shè)置為不同的顏色(紅色)。行的顏色的設(shè)置需要編寫(xiě)使用OpenOffice.org的API中的很多方法的幾行代碼,而為了避免重復(fù)編寫(xiě)相同的代碼,我們將這些代碼組織到一個(gè)輔助性方法當(dāng)中去,在需要進(jìn)行設(shè)置的時(shí)候,我們只需要將顏色作為參數(shù)傳遞就可以了。這可以使我們的代碼易讀性更好,更容易維護(hù)。下面我們將更詳細(xì)地討論這些輔助性方法。
請(qǐng)記住,以下述及的輔助性方法可以用于任何應(yīng)用程序,這些輔助性方法并不依賴于本篇文章里述及的應(yīng)用程序。換句話說(shuō),您可以充分地利用這些輔助性方法,在需要的時(shí)候不需要對(duì)代碼進(jìn)行任何修改就可以將這些代碼粘貼到應(yīng)用程序的Java文件中使用。您也可以在您的代碼中引用這些代碼,就像這篇文章中做的一樣。
3.1 使用引導(dǎo)程序
OpenOffice.org的Java API有自己的方法來(lái)引導(dǎo)OpenOffice.org。所謂“引導(dǎo)”OpenOffice.org,我們的意思是加載OpenOffice.org的啟動(dòng)程序。這通過(guò)尋找juh.jar文件所在的位置,然后在這個(gè)位置或者上一級(jí)目錄查找soffice(.exe)來(lái)實(shí)現(xiàn)。這需要將juh.jar文件置于系統(tǒng)變量CLASSPATH所描述的目錄中,這樣本章構(gòu)建的應(yīng)用程序就可以訪問(wèn)到這個(gè)文件。然而,這里需要將juh.jar文件隨同應(yīng)用程序一起分發(fā),這種情況下,這種引導(dǎo)機(jī)制就不奏效了。
為了解決這個(gè)問(wèn)題,有兩種可能的方法。首先,可以確保Java隨時(shí)都可以查找到soffice(.exe),這可以通過(guò)將包含可執(zhí)行文件的目錄加入到Windows的PATH系統(tǒng)變量中(在Mac、Unix和Linux中就是LD_LIBRARY_PATH系統(tǒng)變量)。這種方法需要用戶進(jìn)行一些操作,而我們并不希望這樣做。
因此,我們更傾向于推薦第二種方法,這種方法需要與訪問(wèn)修飾符協(xié)同工作。在Sun的JDK中,ClassLoader系統(tǒng)類是URLClassLoader類的實(shí)例。這個(gè)類有一個(gè)私有方法addURL,這個(gè)方法在Java系統(tǒng)開(kāi)始的時(shí)候?qū)⒈徽{(diào)用,從而將JAR文件以及其他相關(guān)資源添加到系統(tǒng)環(huán)境中。通過(guò)反射機(jī)制,我們獲取一個(gè)URLClassLoader的實(shí)例,爾后使得addURL方法達(dá)到可訪問(wèn)狀態(tài),然后再將包含可執(zhí)行文件的目錄添加到URLClassLoader的URL棧中。這雖然顯得很晦澀,但是這種方法很奏效。
但是,它真的那么奏效嗎?與系統(tǒng)類的訪問(wèn)修飾周旋總是一件冒險(xiǎn)的事情。addURL方法被聲明為protected型的,自然有其理由。另外,誰(shuí)能保證使用的一定是Sun的JDK呢?或者Sun可能在隨后的版本中忽略這個(gè)方法?然而,Java規(guī)范對(duì)上述這些事情并沒(méi)有作出明確的聲明,因此別的JDK在默認(rèn)情況下并不是將ClassLoader類的類型配置為URLClassLoader。正是這個(gè)原因,我們使用“loader instanceof URLClassLoader”這樣的檢查代碼來(lái)確保事情是如預(yù)期那樣的。這也是我們?cè)谟脩魶](méi)有使用Sun的JDK的情況下確保應(yīng)用程序沒(méi)有任何異常情況而需付出的代價(jià)。
關(guān)于過(guò)程中構(gòu)建對(duì)象的更詳細(xì)的信息請(qǐng)參考OpenOffice.org的開(kāi)發(fā)指南《第6章 Office開(kāi)發(fā)》。
public Object simpleBootstrap(String pathToExecutable) throws Exception
{
//Get the executable from the incoming String:
String ooBaseDirectory = pathToExecutable.replaceAll("soffice(.exe){0,1}$","");
System.out.println("Your ooBaseDir is: " + ooBaseDirectory);
ClassLoader loader = ClassLoader.getSystemClassLoader();
if (loader instanceof URLClassLoader){
URLClassLoader cl = (URLClassLoader)loader;
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod
("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(cl, new Object[]{new File(ooBaseDirectory).toURL()});
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
} else {
System.out.println("Error occured, URLClassLoader expected but " +
loader.getClass() + " received. Could not continue.");
}
//Get the office component context:
XComponentContext xContext = Bootstrap.bootstrap();
//Get the office service manager:
XMultiComponentFactory xServiceManager = xContext.getServiceManager();
//Create the desktop, which is the root frame of the
//hierarchy of frames that contain viewable components:
Object desktop = xServiceManager.createInstanceWithContext
("com.sun.star.frame.Desktop", xContext );
return desktop;
}
另一中方法就是使用遠(yuǎn)程連接。在遠(yuǎn)程連接中,服務(wù)器名稱和端口號(hào)作為參數(shù)傳遞給遠(yuǎn)程連接方法,然后這個(gè)方法啟動(dòng)OpenOffice.org并返回Desktop對(duì)象,這個(gè)對(duì)象是利用OpenOffice.org工作的起點(diǎn)。而且在遠(yuǎn)程連接的情況下,您可以讓用戶選擇服務(wù)器和端口,或者您可以在代碼中使用系統(tǒng)設(shè)置來(lái)提供服務(wù)器和端口,這都看您的選擇。
--------------------------------------------------------------------------------
3.2 電子表格文檔的建立和加載
上一節(jié)描述的方法幫助我們從服務(wù)管理器中獲取了com.sun.star.frame.Desktop服務(wù)。Desktop可以根據(jù)給定的URL來(lái)加載新的或者已經(jīng)存在的組件。為了提供這樣的服務(wù),Desktop實(shí)現(xiàn)了com.sun.star.frame.XcomponentLoader接口,這個(gè)接口只有一個(gè)方法根據(jù)給定的URL加載和實(shí)例化對(duì)應(yīng)的組件。要構(gòu)建一個(gè)新的電子表格文檔組件,可以使用“private:factory/scalc”這樣的URL。關(guān)于更詳細(xì)的信息請(qǐng)參考OpenOffice.org開(kāi)發(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);
}
下面這個(gè)方法將由用戶界面所調(diào)用,在調(diào)用之前用戶需要將必要的參數(shù)傳遞給上面代碼中描述的方法:
XComponent xSpreadsheetComponent =
oooHelper.getSpreadsheetComponent(desktop, "private:factory/scalc");
接著,我們需要獲取電子表格文檔對(duì)象:
public XSpreadsheetDocument getXSpreadsheetDocument(XComponent xSpreadsheetComponent)
throws Exception
{
return(XSpreadsheetDocument)UnoRuntime.queryInterface
(XSpreadsheetDocument.class, xSpreadsheetComponent);
}
下一個(gè)定義的方法,getXSpreadsheet( ),定義如下,這個(gè)方法幫助我們精確定位要與哪個(gè)電子表格文檔進(jìn)行交互。默認(rèn)情況下,Calc應(yīng)用程序在啟動(dòng)的時(shí)候就已經(jīng)建立好了三個(gè)電子表。這三個(gè)電子表的名稱分別是“Sheet1”、“Sheet2”、“Sheet3”,這三個(gè)電子表會(huì)隨著您啟動(dòng)Calc應(yīng)用程序而打開(kāi)。如果您將字符串“Sheet1”傳遞給getXSpreadsheet( )方法,那么接下來(lái)您所做的改動(dòng)都將在“Sheet1”電子表中進(jìn)行。然而,您或許想要給自定義的電子表起一個(gè)不同于默認(rèn)命名方式的名字。比如說(shuō),您將電子表命名為“Javalobby Article Analyzer”。如果您將這個(gè)名字作為參數(shù)傳遞給getXSpreadsheet( )方法,一個(gè)以此字符串命名的電子表將被構(gòu)建。
然而,默認(rèn)情況下,叫“Sheet1”的電子表仍然是當(dāng)前電子表,所謂當(dāng)前電子表就是在應(yīng)用程序啟動(dòng)時(shí)呈現(xiàn)在用戶面前的那個(gè)電子表。無(wú)論您是否新建電子表,默認(rèn)的三個(gè)電子表始終都是存在的。假如您想將您自己定義的電子表設(shè)為當(dāng)前狀態(tài),您可以有兩種選擇。一種是使用在getXSpreadsheet( )方法之后定義的getXActiveSpreadsheet( )方法,另外您可以直接將默認(rèn)的三個(gè)電子表刪除掉,就如下面的getXSpreadsheet( )方法中的一樣,而一旦這三個(gè)電子表被刪除之后也就只剩下您自定義的那個(gè)電子表了,所剩的最后一個(gè)電子表也就理所當(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);
}
接下來(lái)的方法是如何將電子表設(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;
}
--------------------------------------------------------------------------------
3.3 數(shù)據(jù)的設(shè)置
我們需要使用的有三種類型的數(shù)據(jù)。在開(kāi)始之前,我們需要有個(gè)方法來(lái)獲得對(duì)單元格的訪問(wèn)。這一節(jié)的其他輔助性方法也將使用此方法,定義如下:
public XCell getXCellByPosition(XSpreadsheet xSpreadsheet, int x, int y)
throws Exception
{
return xSpreadsheet.getCellByPosition(x, y);
}
首先,我們將要接觸到文本類型的數(shù)據(jù),比如說(shuō)Javalobby文章的標(biāo)題。對(duì)于這種數(shù)據(jù),輔助性方法需要電子表對(duì)象、列位置、行位置以及數(shù)據(jù)本身作為參數(shù)。
public void setTextValueOfXCellAtPosition(XSpreadsheet
xSpreadsheet, int x, int y, String value) throws Exception
{
//We first identify the cell we need to work with,
//using the incoming x and y values:
XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
//Next, since we're working with text, we define
//a text object and a cursor object and insert the received content into the cell:
XText xText = (com.sun.star.text.XText)UnoRuntime.queryInterface(com.sun.
star.text.XText.class, xCell);
XTextCursor xTextCursor = xText.createTextCursor();
xText.insertString(xTextCursor, value, false);
}
其次,對(duì)于數(shù)字類型的數(shù)據(jù),比如說(shuō)“Reply”列的數(shù)據(jù),輔助性方法要求傳遞double類型的參數(shù):
public void setNumValueOfXCellAtPosition(XSpreadsheet
xSpreadsheet, int x, int y, double value) throws Exception
{
//First we get the cell identified by the received x and y values:
XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
//Then we add the received value to the identified cell:
xCell.setValue(value);
}
最后,盡管Calc的公式是普通的字符串,我們可以使用OpenOffice.org的API所包含的單元格樣式屬性來(lái)為單元格設(shè)置預(yù)定義的“Result”樣式,這主要是針對(duì)我們匯總回復(fù)總數(shù)的計(jì)算公式來(lái)進(jìn)行設(shè)置:
public void setFormulaOfXCellAtPosition(XSpreadsheet
xSpreadsheet, int x, int y, String formula) throws Exception
{
//We get the cell defined by the incoming x and y values"
XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
//We add a Calc formula to the cell, as received by the helper method:
xCell.setFormula(formula);
//We attach a property set to our cell, so that we can define a property:
XPropertySet xCellProps = (XPropertySet)UnoRuntime.
queryInterface(XPropertySet.class, xCell);
//We set the style of the cell, using a predefined "Result" style,
//which comes out of the box with the OpenOffic.org API:
xCellProps.setPropertyValue("CellStyle", "Result");
}
3.4 顏色的使用
下面的代碼將在隨后被使用:
if (position%2 == 0)
{
oooHelper.setColorRow(xSpreadsheet, position, 0xFF9933);
}
在ARGB顏色空間中,0xFF9933代表橙色。如果行數(shù)是偶數(shù),那么電子表、行數(shù)以及橙色會(huì)被作為參數(shù)傳遞給方法:
public void setColorRow(XSpreadsheet
xSpreadsheet, int row, int color) throws Exception
{
//First we get the range of cells we want to deal with,
//which is the whole spreadsheet:
XCellRange xCellRange = (XCellRange)UnoRuntime.queryInterface
( XCellRange.class, xSpreadsheet );
//Next, we narrow down our selection further,
//going from column 0/current row to column 3/current row,
//which is a whole row from left to right:
XCellRange xSelectedCells = xCellRange.getCellRangeByPosition(0, row, 3, row);
//Next, we create a property set and assign it to our selected range:
XPropertySet xCellProps =
(XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xSelectedCells);
//This line sets the color to white, which basically
//refreshes the row color before we add our new row color:
xCellProps.setPropertyValue("CellBackColor", new Integer(16777215));
//This line sets the color to whatever is received,
//in this case orange:
xCellProps.setPropertyValue("CellBackColor", new Integer(color));
}
如果用戶需要看到“Most Replies”或者“Least Replies”,我們將使用以下代碼進(jìn)行設(shè)置:
ooHelper.setColorCell(xSpreadsheet, 2, jTable1.getRowCount()+5, 0x008000);
以下的方法需要電子表、列數(shù)、行數(shù)以及顏色值作為參數(shù):
public void setColorCell(XSpreadsheet xSpreadsheet, int column, int row, int color)
throws Exception
{
//First, we select the entire received spreadsheet:
XCellRange xCellRange = (XCellRange)UnoRuntime.queryInterface( XCellRange.class,
xSpreadsheet );
//From the received spreadsheet, we select a single cell,
//defined by the row and column received:
XCellRange xSelectedCells = xCellRange.getCellRangeByPosition(column,
row, column, row);
//We define a property set, an object to contain the cell's properties:
XPropertySet xCellProps = (XPropertySet)UnoRuntime.queryInterface
(XPropertySet.class, xSelectedCells);
//This line sets the color to white, to refresh the cell:
xCellProps.setPropertyValue("CellBackColor", new Integer(16777215));
//This line sets the background color of the cell to whatever is received:
xCellProps.setPropertyValue("CellBackColor", new Integer(color));
}
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/mrdangdong/archive/2009/01/08/3733421.aspx