翻譯:OpenOffice.org API介紹(一)

          Posted on 2007-07-12 17:36 Tommy Jian 閱讀(7725) 評論(5)  編輯  收藏 所屬分類: OpenOffice.org

          1.引言

           

             許多商業(yè)應(yīng)用程序允許用戶在應(yīng)用程序中生成基于某些數(shù)據(jù)的報表。電子表格特別適合用于生成這樣的報表。電子表格不僅可以將數(shù)據(jù)經(jīng)格式化以后以結(jié)構(gòu)化的形式展現(xiàn)給用戶,而且為用戶提供了快速且高效的數(shù)據(jù)處理功能。正如上面所說的,OpenOffice.org的API提供了大量的類和方法以方便開發(fā)者將OpenOffice.org電子表格的功能集成到他們自己的應(yīng)用程序中。在應(yīng)用程序中,單擊某個按鈕就可以啟動OpenOffice.org并將應(yīng)用程序生成的數(shù)據(jù)以自定義電子表格的形式展現(xiàn)出來。

             新手可能就這個開發(fā)領(lǐng)域很自然地提出一個問題:“一旦開發(fā)者正確地安裝了所有需要的軟件后,一個應(yīng)用程序如何啟動OpenOffice.org的新實例以及如何獲取連接呢?”。這個問題得到了需要的回答之后,開發(fā)者還可能提出:“現(xiàn)在用戶應(yīng)用程序已經(jīng)獲取了OpenOffice.org的連接,那么應(yīng)用程序應(yīng)該如何將這些數(shù)據(jù)嵌入到電子表格中呢?”。在這篇文章中,我們將首先著重滿足不熟悉OpenOffice.org的API的開發(fā)者的兩個基本的需求。我們將向開發(fā)者展示如何獲取到OpenOffice.org的連接,如何將應(yīng)用程序的數(shù)據(jù)轉(zhuǎn)化為電子表格形式的數(shù)據(jù)。接著我們將討論一些其他的主題,這些主題包括以編程方式構(gòu)建和析構(gòu)電子表格、設(shè)置電子表格的單元格的背景顏色以及單元格邊框的格式化。然而,這里需要注意的是我們只關(guān)注OpenOffice.org本身的集成,為了代碼的可讀性我們忽略了諸如錯誤處理之類的問題。在這篇文章的結(jié)尾,您將對OpenOffice.org的API處理電子表格和如何在您自己的應(yīng)用程序中利用它們的相關(guān)知識有所了解。

             這篇文章涉及的應(yīng)用程序是基于Swing的應(yīng)用程序,它通過使用OpenOfiice.org的API來訪問OpenOffice.org的各種功能。當然,您也可以使用C++或者COM/DCOM技術(shù)來連接OpenOffice.org。此類應(yīng)用程序的代碼并不一定必須基于Swing來編寫。這樣的應(yīng)用程序可以使用C++、Java servlet、Java Server Page、JavaScript、VBScript、Delphi以及Visual Basic來編寫。這篇文章中使用的基于Swing的應(yīng)用程序?qū)⑹褂肗etBeans IDE來構(gòu)建,并且使用NetBeans Platform作為起始點。盡管任何集成開發(fā)工具都可以被用來構(gòu)建如此簡單的應(yīng)用程序,但是使用NetBeans進行開發(fā)具有兩項優(yōu)勢。首先,在NetBeans中我們可以充分發(fā)揮GUI構(gòu)建器(即Matisse)的功能來構(gòu)建用戶界面,GUI構(gòu)建器可以幫助我們快速建立應(yīng)用程序界面的原型。其次,將我們的應(yīng)用程序基于NetBeans Platform意味著我們不需要再重頭開始,而且我們可以通過其提供的模塊框架來增強應(yīng)用程序的可擴展性。這個應(yīng)用程序?qū)⑸扇缦聢D所示的不需要任何后期處理的電子表格文檔:

             電子表格中的數(shù)據(jù)來自于JTable組件。在現(xiàn)實情況下,這些數(shù)據(jù)往往來源于數(shù)據(jù)庫中。在上面述及的應(yīng)用程序中,我們將把數(shù)據(jù)硬編碼在程序代碼中,這主要是因為數(shù)據(jù)的來源問題已經(jīng)超出本篇文章的范圍了。無論數(shù)據(jù)是否是來自于數(shù)據(jù)庫,當用戶已經(jīng)完成了數(shù)據(jù)的處理后,應(yīng)用程序?qū)袹Table中的數(shù)據(jù)轉(zhuǎn)換生成電子表格來呈現(xiàn)。除了數(shù)據(jù)之外,上面的圖還展示了以下幾個元素,這些元素將在下面的章節(jié)中述及:

          •   表頭,電子表格有一行使用特殊顏色(深藍色)標識的表頭。
          •   行顏色的交錯,電子表格中的其他行的顏色是交錯的,有的背景色是桔色,而有的是白色。
          •   高或者低的回復(fù),最后一列展示了某篇文章相關(guān)的回復(fù)數(shù)量,回復(fù)量比較高的行的背景顏色是綠色,而回復(fù)量比較低的行的背景顏色是紅色,另外,在主表格的下方的兩個單元格分別使用相同的顏色來標識高或者低回復(fù)文章的作者。
          •   回復(fù)的總數(shù),“Reply”列的最后一行的下方的單元格顯示了總回復(fù)數(shù),這個單元格的格式與其他的單元格不太一樣,總回復(fù)數(shù)是通過OpenOffice.org的API來使用Calc的公式計算得到的。
          • 電子表格名稱,在上面圖形的左下角,您可以看到“Javalobby Analysis”這樣的名稱,而您并沒有看到Calc打開時的默認的電子表(名稱為“Sheet1”、“Sheet2”、“Sheet3”),如下文所闡述的,電子表的名稱的更改和默認電子表的移除都可以使用編程方式來實現(xiàn)。

             這篇文章被分為三部分,這三部分按順序描述了開發(fā)的過程:

          1.   簡化重復(fù)的編碼任務(wù),這一節(jié)中我們將了解OpenOffice.org的API中可復(fù)用的元素,而這些元素將在后面的章節(jié)中被集成到我們的應(yīng)用程序中。
          2. 建立用戶界面原型,為了測試最后一節(jié)中的業(yè)務(wù)邏輯,我們將構(gòu)建Swing應(yīng)用程序的原型。
          3. 集成輔助性方法,應(yīng)用程序的核心是將輔助性方法和用戶界面集成起來,并且執(zhí)行計算,生成電子表格。

            2.系統(tǒng)需求

               在開始之前,請先確認以下的軟件已經(jīng)安裝好了:

            • OpenOffice.org,盡管這篇文章中的代碼也兼容Star Office,但是因為我們使用OpenOffice.org的API相關(guān)的JAR文件,所以最好是安裝OpenOffice.org。我們將使用在OpenOffice.org的安裝目錄下的四個JAR文件,您可以在OpenOffice.org 2.0\program\classes文件夾中找到以下四個JAR文件:juh.jar、jurt.jar、ridl.jar和unoil.jar。
            • NetBeans IDE,這篇文章關(guān)注的是OpenOffice.org的API,其中討論的代碼可以使用很多種編程語言描述,可以供多種語言編寫的應(yīng)用程序使用。如果您想構(gòu)建這篇文章中描述的基于Swing的應(yīng)用程序,您就需要去下載NetBeans 5.0或者更高的版本。

               注意:這篇文章中展現(xiàn)的應(yīng)用場景并不需要使用OpenOffice.org SDK。如果我們要使用SDK中的idlc或者javamaker等工具,那么這個時候才需要SDK。

            3.背景知識:簡化重復(fù)的編碼工作

               當我們使用OpenOffice.org的API工作時,我們可能會重復(fù)地執(zhí)行某些任務(wù)。比如說,我們設(shè)置電子表格表頭的顏色,但是同時我們也需要設(shè)置其他各行的顏色。實際上,我們經(jīng)常交替地設(shè)置各行的顏色,這樣可以使得電子表格中的行更容易分辨。如果某篇文章的回復(fù)數(shù)比較高,我們會將對應(yīng)的行設(shè)置為不同的顏色(綠色),而回復(fù)數(shù)比較低的行也被設(shè)置為不同的顏色(紅色)。行的顏色的設(shè)置需要編寫使用OpenOffice.org的API中的很多方法的幾行代碼,而為了避免重復(fù)編寫相同的代碼,我們將這些代碼組織到一個輔助性方法當中去,在需要進行設(shè)置的時候,我們只需要將顏色作為參數(shù)傳遞就可以了。這可以使我們的代碼易讀性更好,更容易維護。下面我們將更詳細地討論這些輔助性方法。

               請記住,以下述及的輔助性方法可以用于任何應(yīng)用程序,這些輔助性方法并不依賴于本篇文章里述及的應(yīng)用程序。換句話說,您可以充分地利用這些輔助性方法,在需要的時候不需要對代碼進行任何修改就可以將這些代碼粘貼到應(yīng)用程序的Java文件中使用。您也可以在您的代碼中引用這些代碼,就像這篇文章中做的一樣。

              3.1 使用引導(dǎo)程序

               OpenOffice.org的Java API有自己的方法來引導(dǎo)OpenOffice.org。所謂“引導(dǎo)”OpenOffice.org,我們的意思是加載OpenOffice.org的啟動程序。這通過尋找juh.jar文件所在的位置,然后在這個位置或者上一級目錄查找soffice(.exe)來實現(xiàn)。這需要將juh.jar文件置于系統(tǒng)變量CLASSPATH所描述的目錄中,這樣本章構(gòu)建的應(yīng)用程序就可以訪問到這個文件。然而,這里需要將juh.jar文件隨同應(yīng)用程序一起分發(fā),這種情況下,這種引導(dǎo)機制就不奏效了。

               為了解決這個問題,有兩種可能的方法。首先,可以確保Java隨時都可以查找到soffice(.exe),這可以通過將包含可執(zhí)行文件的目錄加入到Windows的PATH系統(tǒng)變量中(在Mac、Unix和Linux中就是LD_LIBRARY_PATH系統(tǒng)變量)。這種方法需要用戶進行一些操作,而我們并不希望這樣做。

               因此,我們更傾向于推薦第二種方法,這種方法需要與訪問修飾符協(xié)同工作。在Sun的JDK中,ClassLoader系統(tǒng)類是URLClassLoader類的實例。這個類有一個私有方法addURL,這個方法在Java系統(tǒng)開始的時候?qū)⒈徽{(diào)用,從而將JAR文件以及其他相關(guān)資源添加到系統(tǒng)環(huán)境中。通過反射機制,我們獲取一個URLClassLoader的實例,爾后使得addURL方法達到可訪問狀態(tài),然后再將包含可執(zhí)行文件的目錄添加到URLClassLoader的URL棧中。這雖然顯得很晦澀,但是這種方法很奏效。

               但是,它真的那么奏效嗎?與系統(tǒng)類的訪問修飾周旋總是一件冒險的事情。addURL方法被聲明為protected型的,自然有其理由。另外,誰能保證使用的一定是Sun的JDK呢?或者Sun可能在隨后的版本中忽略這個方法?然而,Java規(guī)范對上述這些事情并沒有作出明確的聲明,因此別的JDK在默認情況下并不是將ClassLoader類的類型配置為URLClassLoader。正是這個原因,我們使用“loader instanceof URLClassLoader”這樣的檢查代碼來確保事情是如預(yù)期那樣的。這也是我們在用戶沒有使用Sun的JDK的情況下確保應(yīng)用程序沒有任何異常情況而需付出的代價。

               關(guān)于過程中構(gòu)建對象的更詳細的信息請參考OpenOffice.org的開發(fā)指南《第6章  Office開發(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;
            }

             

               另一中方法就是使用遠程連接。在遠程連接中,服務(wù)器名稱和端口號作為參數(shù)傳遞給遠程連接方法,然后這個方法啟動OpenOffice.org并返回Desktop對象,這個對象是利用OpenOffice.org工作的起點。而且在遠程連接的情況下,您可以讓用戶選擇服務(wù)器和端口,或者您可以在代碼中使用系統(tǒng)設(shè)置來提供服務(wù)器和端口,這都看您的選擇。


            本文譯自NetBeans.org中的文章,其中的代碼也都經(jīng)過譯者測試。未完待續(xù)!!!

            Feedback

            # re: 翻譯:OpenOffice.org API介紹(一)  回復(fù)  更多評論   

            2008-07-09 15:51 by xiaowu
            是否有openOffice 中文API 以及各接口的作用及用法

            # re: 翻譯:OpenOffice.org API介紹(一)[未登錄]  回復(fù)  更多評論   

            2008-08-27 10:41 by 人在天涯
            對啊。同上,我也需要一個API以及各個接口的作用和方法的文檔

            # re: 翻譯:OpenOffice.org API介紹(一)[未登錄]  回復(fù)  更多評論   

            2008-08-27 10:42 by 人在天涯
            有的郵件bentengwu@163.com.有的話發(fā)我。大恩大德沒齒難忘

            # re: 翻譯:OpenOffice.org API介紹(一)  回復(fù)  更多評論   

            2010-04-27 17:35 by gohin
            是否有openOffice 中文API 以及各接口的作用及用法,
            萬分感激,gohinb@163.com.

            # re: 翻譯:OpenOffice.org API介紹(一)  回復(fù)  更多評論   

            2010-07-03 17:36 by yukun
            你好博主

            如果能提供一個API以及各個接口的作用和方法的文檔或者,提示我一下哪里能找到此類文檔,感激不盡。

            yukun18@hotmail.com

            只有注冊用戶登錄后才能發(fā)表評論。


            網(wǎng)站導(dǎo)航:
             
            主站蜘蛛池模板: 天峻县| 宝清县| 祁阳县| 遵义市| 中牟县| 聂荣县| 灵寿县| 德安县| 汶川县| 嫩江县| 扶余县| 肥东县| 杭州市| 乌兰浩特市| 三台县| 锦屏县| 沁阳市| 常山县| 高雄市| 贵州省| 长汀县| 通州区| 横峰县| 澜沧| 浦北县| 抚松县| 宜兰市| 繁昌县| 乐至县| 元朗区| 当涂县| 莱阳市| 上思县| 和政县| 车致| 搜索| 海晏县| 中宁县| 德钦县| 额敏县| 思茅市|