最近开发用到财务报表的业务需求,搜到好东西,转贴分享
Formula One除了Windows版外,还有Java版?借助Java的跨平台机制,加上Formula One强大的表格能力,以及100%兼容Excel的特性,完全可以在Linux及各种支持Java2的平台(如众多版本的Unix)上享受与Excel一样的电子表格功能.
Formula One For Java的下载请到如下网址:http://www.actuate.com/f1/home/index.asp。下载前需要填写一张身份登记表,然后才能下载。
下载完成后,可能是一个ZIP文件,也可能是一个JAR文件,还有可能是一个SH、BIN或EXE文件,视所下载的版本和平台而定。如果是ZIP,则用WinZip解压;如果是JAR,则使用“java -jar <filename.jar>”来运行;SH文件和BIN文件都可以用“sh <filename>”方法来运行,EXE文件就不用多说了。
最重要的是两个文件(以8.0为例):F1J8Swing.jar和F1J8_zhs.jar。其它的是例子、教程和API文档。F1J8Swing.jar是主文件,它包含了一个标准的JavaBean:com.f1j.swing.JBook。F1J8_zhs.jar是中文语言包,必须下载了“国际化支持软件包”后才有,而没有这个软件包(还没找到呢,8.0版本是在该网站的Suport栏目中发现的)。
Formula One完整地支持五种语言,但是对中文只是部分支持,这不能不说是一种遗憾。相信在以后的版本中,会做得更好。
安装完毕后,把两个主文件加入到ClassPath中,然后在图形界面的控制台下输入测试命令以启动它内嵌的设计器。如果不是在图形环境下,设计器将无法启动。对于Linux,图形界面是X-Window(GNOME/KDE);对于Windows系统,则是它本身,测试命令如下:
java com.f1j.swing.designer .Designer |
如果看到了图1那样的界面,说明一切正常。
在IDE环境(如JBuilder)中,可以像普通JavaBean那样,把F1Book安装到控件板上,即拖即用,非常方便。
提示:Formula One for Java只有30天的试用期。
设某企业要出一份报表,数据来源是关系型数据库,最终要求是生成Excel表格,并能打印出来。
图5是一种可行的方案。
图5 系统结构示意图
采用Tomcat+Apache,利用Servlet和Jsp向用户提供Web访问页面,利用Formula One For Java生成并发布报表。
这种结构对于大多数Java开发者来说都不陌生,所以本文只介绍与Formula One For Java相关的内容。
在服务器端的Servlet部份,需要完成的工作是取出数据,生成报表。在客户端的Applet部分,要做的工作是接收报表,并且显示出来。
1. 生成报表
生成报表的工作很简单,只需要先创建一个JBook类的实例,然后往里填数据就行了。代码示例如下:
import com.f1j.swing.*; import java.sql.*; ... Connection con = DriverManager.getConnection(url, user, passwd); try { Statement stmt = con. createStatement(); ResultSet rs = stmt.execute Query(sql); JBook book = new JBook(); int i = 0; while (rs.next()) { i++; for (int j=1; j<=rs.getMeta Data().getColumnCount(); j++) { //往单元格里填入数据库字段的值 book.setEntry(i, j, rs.getString(j)); } } } finally { con.close(); } |
2. 传输报表
JBook是一个对象。对象传输最常用的方法就是使用串行化(Serializable),然而,对于JBook是不行的。因为JBook是基于Swing技术的对象,Swing对于Serializable的支持不稳定,高、低版本有可能不兼容。如果采用这种方法传输,则要求客户端和服务器端用的JRE是相同版本的,这一点其实很难做到。比如,服务器是HP-UX平台,而客户端是Windows平台,就很难保证它们上面的JRE版本一致。因为它们由不同的厂商提供,而且不可能要求所有的用户都安装同一版本的JRE。
Formula One For Java考虑到了这个问题,在它的JBook对象中,增加了如下方法:
1.WriteToBlob(),还有
//把JBook对象写入一个OutputStream public void write(java.io.OutputStream stream,short fileType) throws java.io.IOException, F1Exception //从InputStream中读入一个JBook对象 public short read(java.io.InputStream stream) throws java.io.IOException, F1Exception |
下面是发送和接收的代码示例。
发送:
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,java.io.IOException { resp.setContentType("application/octet-stream"); ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); //按Excel97格式传输JBook对象 book.write(byteOut, JBook.eFileExcel97); byte[] buf = byteOut.toByteArray(); resp.setContentLength(buf.length); ServletOutputStream servletOut = resp.getOutputStream(); servletOut.write(buf); servletOut.close(); } |
接收: readFromBlob();
public JBook getBookFromServer(String servletName) { //指向被请求的Servlet URL url = new URL(servetUrl); HttpURLConnection urlcon = (HttpURLConnection)url.openConnection(); urlcon.setRequestMethod("POST"); urlcon.setDoOutput(false); urlcon.setDoInput(true); InputStream is = urlcon.getInputStream(); JBook book = new JBook(); //从InputStream中读取JBook对象 book.read(is); return book; } |
3. 显示报表
只要把JBook对象加入到Applet上就可显示报表。
getContentPane().setLayout(new BorderLayout(0,0)); getContentPane().add(BorderLayout.CENTER, book); |
public byte[] writeToBlob() throws F1Exception
Document.fileSaveCopyAsByteArray(DocumentType, DocumentSaveCallback)
read
methods to load a spreadsheet into the book
or call the Book.initBook method.
read(byte[])
,
write(com.f1j.ss.Sheet, short)
,
readFromBlob(byte[])
其它扩充的功能
Formula One For Java以Java为基础,提供了强大的Excel风格的报表功能,并且能应用于多种需要报表引擎的场合。
对于上面这个例子,有许多扩充方案,比如:
1.在生成报表时,new JBook()之后,接着读取某个Excel文件,作为JBook对象的模板;当数据取完后,可以把JBook存为一个Excel文件发布到网上,供用户下载;对于一个大型企业,主管部门只要编写一次Excel表,就可以让所有填表部门直接使用,主管部门可以从网上任意下载某部门的报表进行审阅。
2.在取数时,可以为单元格设置取数规则和填写规则;再根据设置好的规则取数填表。
3.还可以设置表格的行运算、列运算、单元格间运算;也能实现很复杂的报表,如财务表格。
当然,还有许多扩充方案,充分发挥你的创造力吧!