我们需要用的有三U类型的数据。在开始之前,我们需要有个方法来获得对单元格的访问。这一节的其他辅助性方法也用此Ҏ(gu)Q定义如下:(x)
首先Q我们将要接触到文本cd的数据,比如说Javalobby文章的标题。对于这U数据,辅助性方法需要电(sh)子表对象、列位置、行位置以及数据本n作ؓ(f)参数?
其次Q对于数字类型的数据Q比如说“Reply”列的数据Q辅助性方法要求传递doublecd的参敎ͼ(x)
最后,管Calc的公式是普通的字符Ԍ我们可以使用OpenOffice.org的API所包含的单元格样式属性来为单元格讄预定义的“Result”样式Q这主要是针Ҏ(gu)们汇d复L的计公式来q行讄Q?
下面的代码将在随后被使用Q?
在ARGB颜色I间中,0xFF9933代表色。如果行数是偶数Q那么电(sh)子表、行C及橙色会(x)被作为参C递给Ҏ(gu)Q?
如果用户需要看?#8220;Most Replies”或?#8220;Least Replies”Q我们将使用以下代码q行讄Q?
以下的方法需要电(sh)子表、列数、行C及颜色g为参敎ͼ(x)
本文译自NetBeans.org中的文章,其中的代码也都经q译者测试。未完待l!Q!
上一节描q的Ҏ(gu)帮助我们从服务管理器中获取了com.sun.star.frame.Desktop服务。Desktop可以Ҏ(gu)l定的URL来加载新的或者已l存在的lg。ؓ(f)了提供这L(fng)服务QDesktop实现了com.sun.star.frame.XcomponentLoader接口Q这个接口只有一个方法根据给定的URL加蝲和实例化对应的组件。要构徏一个新的电(sh)子表格文档组Ӟ可以使用“private:factory/scalc”q样的URL。关于更详细的信息请参考OpenOffice.org开发指南《第8?nbsp; ?sh)子表格》中?.2.1 “?sh)子表格文的徏立和加?#8221;?/p>
下面q个Ҏ(gu)由用户界面所调用Q在调用之前用户需要将必要的参C递给上面代码中描q的Ҏ(gu)Q?
接着Q我们需要获取电(sh)子表格文档对象:(x)
下一个定义的Ҏ(gu)QgetXSpreadsheet( )Q定义如下,q个Ҏ(gu)帮助我们_定位要与哪个?sh)子表格文q行交互。默认情况下QCalc应用E序在启动的时候就已经建立好了三个?sh)子表。这三个?sh)子表的名称分别?#8220;Sheet1”?#8220;Sheet2”?#8220;Sheet3”Q这三个?sh)子表?x)随着(zhn)启动Calc应用E序而打开。如果?zhn)字W串“Sheet1”传递给getXSpreadsheet( )Ҏ(gu)Q那么接下来(zhn)所做的改动都将?#8220;Sheet1”?sh)子表中q行。然而,(zhn)或许想要给自定义的?sh)子表v一个不同于默认命名方式的名字。比如说Q?zhn)?sh)子表命名?#8220;Javalobby Article Analyzer”。如果?zhn)这个名字作为参C递给getXSpreadsheet( )Ҏ(gu)Q一个以此字W串命名的电(sh)子表被构徏?
然而,默认情况下,?#8220;Sheet1”的电(sh)子表仍然是当前电(sh)子表Q所谓当前电(sh)子表是在应用程序启动时呈现在用户面前的那个?sh)子表。无论?zhn)是否新徏电(sh)子表,默认的三个?sh)子表始终都是存在的。假如?zhn)惛_(zhn)自己定义的?sh)子表设为当前状态,(zhn)可以有两种选择。一U是使用在getXSpreadsheet( )Ҏ(gu)之后定义的getXActiveSpreadsheet( )Ҏ(gu)Q另外?zhn)可以直接默认的三个电(sh)子表删除掉Q就如下面的getXSpreadsheet( )Ҏ(gu)中的一P而一旦这三个?sh)子表被删除之后也就只剩下(zhn)自定义的那个电(sh)子表了Q所剩的最后一个电(sh)子表也就理所当然地成为当前电(sh)子表了?
接下来的Ҏ(gu)是如何将?sh)子表设为当前?sh)子表Q?
本文译自NetBeans.org中的文章,其中的代码也都经q译者测试。未完待l!Q!
许多商业应用E序允许用户在应用程序中生成Z某些数据的报表。电(sh)子表格特别适合用于生成q样的报表。电(sh)子表g仅可以将数据l格式化以后以结构化的Ş式展现给用户Q而且为用h供了快速且高效的数据处理功能。正如上面所说的QOpenOffice.org的API提供了大量的cdҎ(gu)以方便开发者将OpenOffice.org?sh)子表格的功能集成到他们自己的应用程序中。在应用E序中,单击某个按钮可以启动OpenOffice.orgq将应用E序生成的数据以自定义电(sh)子表格的形式展现出来?
新手可能p个开发领域很自然地提Z个问题:(x)“一旦开发者正地安装了所有需要的软g后,一个应用程序如何启动OpenOffice.org的新实例以及如何获取q接呢?”。这个问题得C需要的回答之后Q开发者还可能提出Q?#8220;现在用户应用E序已经获取了OpenOffice.org的连接,那么应用E序应该如何这些数据嵌入到?sh)子表格中呢Q?#8221;。在q篇文章中,我们首先着重满不熟?zhn)OpenOffice.org的API的开发者的两个基本的需求。我们将向开发者展C如何获取到OpenOffice.org的连接,如何应用程序的数据转化为电(sh)子表格Ş式的数据。接着我们讨Z些其他的主题Q这些主题包括以~程方式构徏和析构电(sh)子表根{设|电(sh)子表格的单元格的背景颜色以及单元D框的格式化。然而,q里需要注意的是我们只xOpenOffice.org本n的集成,Z代码的可L我们忽略了诸如错误处理之类的问题。在q篇文章的结,(zhn)将对OpenOffice.org的API处理?sh)子表格和如何在?zhn)自q应用E序中利用它们的相关知识有所了解?
q篇文章涉及的应用程序是ZSwing的应用程序,它通过使用OpenOfiice.org的API来访问OpenOffice.org的各U功能。当Ӟ(zhn)也可以使用C++或者COM/DCOM技术来q接OpenOffice.org。此cd用程序的代码q不一定必d于Swing来编写。这L(fng)应用E序可以使用C++、Java servlet、Java Server Page、JavaScript、VBScript、Delphi以及Visual Basic来编写。这文章中使用的基于Swing的应用程序将使用NetBeans IDE来构建,q且使用NetBeans Platform作ؓ(f)起始炏V尽Q何集成开发工具都可以被用来构建如此简单的应用E序Q但是用NetBeansq行开发具有两优ѝ首先,在NetBeans中我们可以充分发挥GUI构徏器(即MatisseQ的功能来构建用L(fng)面,GUI构徏器可以帮助我们快速徏立应用程序界面的原型。其ơ,我们的应用E序ZNetBeans Platform意味着我们不需要再重头开始,而且我们可以通过其提供的模块框架来增强应用程序的可扩展性。这个应用程序将生成如下图所C的不需要Q何后期处理的?sh)子表格文档Q?
?sh)子表格中的数据来自于JTablelg。在现实情况下,q些数据往往来源于数据库中。在上面q及的应用程序中Q我们将把数据硬~码在程序代码中Q这主要是因为数据的来源问题已经出本篇文章的范围了。无论数据是否是来自于数据库Q当用户已经完成了数据的处理后,应用E序把JTable中的数据转换生成?sh)子表格来呈现。除了数据之外,上面的图q展CZ以下几个元素Q这些元素将在下面的章节中述及:(x)
q篇文章被分Z部分Q这三部分按序描述了开发的q程Q?
在开始之前,请先认以下的Y件已l安装好了:(x)
注意Q这文章中展现的应用场景ƈ不需要用OpenOffice.org SDK。如果我们要使用SDK中的idlc或者javamaker{工P那么q个时候才需要SDK?
当我们用OpenOffice.org的API工作Ӟ我们可能?x)重复地执行某些d。比如说Q我们设|电(sh)子表D头的颜色Q但是同时我们也需要设|其他各行的颜色。实际上Q我们经怺替地讄各行的颜Ԍq样可以使得?sh)子表格中的行更?gu)分L。如果某文章的回复数比较高Q我们会(x)对应的行设|ؓ(f)不同的颜Ԍl色Q,而回复数比较低的行也被设|ؓ(f)不同的颜ԌU色Q。行的颜色的讄需要编写用OpenOffice.org的API中的很多Ҏ(gu)的几行代码,而ؓ(f)了避免重复编写相同的代码Q我们将q些代码l织C个辅助性方法当中去Q在需要进行设|的时候,我们只需要将颜色作ؓ(f)参数传递就可以了。这可以使我们的代码易读性更好,更容易维护。下面我们将更详l地讨论q些辅助性方法?
误住,以下q及的辅助性方法可以用于Q何应用程序,q些辅助性方法ƈ不依赖于本篇文章里述及的应用E序。换句话_(d)(zhn)可以充分地利用q些辅助性方法,在需要的时候不需要对代码q行M修改可以将q些代码_脓(chung)到应用程序的Java文g中用。?zhn)也可以在?zhn)的代码中引用这些代码,像q篇文章中做的一栗?
OpenOffice.org的Java API有自qҎ(gu)来引导OpenOffice.org。所?#8220;引导”OpenOffice.orgQ我们的意思是加蝲OpenOffice.org的启动程序。这通过Ljuh.jar文g所在的位置Q然后在q个位置或者上一U目录查找sofficeQ?exeQ来实现。这需要将juh.jar文g|于pȝ变量CLASSPATH所描述的目录中Q这h章构建的应用E序可以访问到q个文g。然而,q里需要将juh.jar文g随同应用E序一起分发,q种情况下,q种引导机制׃奏效了?
Z解决q个问题Q有两种可能的方法。首先,可以保Java随时都可以查扑ֈsofficeQ?exeQ,q可以通过包含可执行文g的目录加入到Windows的PATHpȝ变量中(在Mac、Unix和Linux中就是LD_LIBRARY_PATHpȝ变量Q。这U方法需要用戯行一些操作,而我们ƈ不希望这样做?
因此Q我们更們于推荐第二种Ҏ(gu)Q这U方法需要与讉K修饰W协同工作。在Sun的JDK中,ClassLoaderpȝcLURLClassLoadercȝ实例。这个类有一个私有方法addURLQ这个方法在Javapȝ开始的时候将被调用,从而将JAR文g以及其他相关资源d到系l环境中。通过反射机制Q我们获取一个URLClassLoader的实例,?dng)后使得addURLҎ(gu)辑ֈ可访问状态,然后再将包含可执行文件的目录d到URLClassLoader的URL栈中。这虽然昑־很晦涩,但是q种Ҏ(gu)很奏效?
但是Q它真的那么奏效吗?与系l类的访问修饰周旋L一件冒险的事情。addURLҎ(gu)被声明ؓ(f)protected型的Q自然有其理由。另外,谁能保证使用的一定是Sun的JDK呢?或者Sun可能在随后的版本中忽略这个方法?然而,Java规范对上q这些事情ƈ没有作出明确的声明,因此别的JDK在默认情况下q不是将ClassLoadercȝcd配置为URLClassLoader。正是这个原因,我们使用“loader instanceof URLClassLoader”q样的检查代码来保事情是如预期那样的。这也是我们在用h有用Sun的JDK的情况下保应用E序没有M异常情况而需付出的代仗?
关于q程中构建对象的更详l的信息请参考OpenOffice.org的开发指南《第6?nbsp; Office开发》?
另一中方法就是用远E连接。在q程q接中,服务器名U和端口号作为参C递给q程q接Ҏ(gu)Q然后这个方法启动OpenOffice.orgq返回Desktop对象Q这个对象是利用OpenOffice.org工作的v炏V而且在远E连接的情况下,(zhn)可以让用户选择服务器和端口Q或者?zhn)可以在代码中使用pȝ讄来提供服务器和端口,q都看?zhn)的选择?
本文译自NetBeans.org中的文章,其中的代码也都经q译者测试。未完待l!Q!