使用Formula One生成Excel报表- -

最近开发用到财务报表的业务需求,搜到好东西,转贴分享

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);

 

4.http://www.birt-exchange.org/documentation/e.Spreadsheet/API/deprecated-list.html

writeToBlob

public byte[] writeToBlob()
                   throws F1Exception
Deprecated.  Replaced by Document.fileSaveCopyAsByteArray(DocumentType, DocumentSaveCallback)
Writes the workbook to a blob. Before calling this method, the programmer must first call one of the  read methods to load a spreadsheet into the book or call the  Book.initBook method.
Returns:
a byte array containing the workbook in the current file format.
Throws:
F1Exception - if an error occurs
See Also:
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.还可以设置表格的行运算、列运算、单元格间运算;也能实现很复杂的报表,如财务表格。 

当然,还有许多扩充方案,充分发挥你的创造力吧!

 

你可能感兴趣的:(java,swing,servlet,Excel,报表,spreadsheet)