随笔 - 225  文章 - 98  trackbacks - 0
<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

随笔分类

相册

报表工具厂商们

搜索

  •  

最新评论

阅读排行榜

  做的Struts 项目中有这样的功能,用户可以将数据导出到Excel 报表,如图1 所示。 

报表样式图
1
设计思路

Java 对于Excel 的操作一般借助于POI 类库,由于该报表的表头比较复杂,直接用POI 控制报表的生成比较困难,这时可以先制作Excel 报表模板,而后再通过Java 调用POI 函数将用户数据写入到Excel 报表模板,最后导出到新的目标文件即可

2 设计步骤

2.1 Excel 报表模板

根据需要设计出Excel 报表,并保存为report.xls报表有复杂的表头,报表4 行为合计行,用于对所有数值型列的各行数据进行汇总,如图1 所示

2.2 Struts 的动作执行函数ExcelExportAction

Action 函数在用户需要执行报表导出时通过Struts 页面调用或用户触发执行

package com.tj.struts.action;

import java.io.FileOutputStream;

import javax.servlet.http.*;

import org.apache.struts.action.*;

import databaseUtil.ExcelPoi;

public class ExcelExportAction extends Action {

public ActionForward execute ( ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)

throws Exception {

//执行SQL 获得输出到报表的数据

String sql=" select * fron project" ;

//准备输出的报表路径,及文件名

String outputfile =" c:\\output.xls" ;

//制作好的报表模板存放路径

String templatefile=" c:\\report.xls" ;

//模板的列数为39

int column=39;

try {

//实例化具体的业务处理类ExcelPoi

ExcelPoi pd = new ExcelPoi (colnum) ;

//getExcelSheet sql 为参数执行查询,将查询数据写入模版文件templatefile的当前工作簿的选定工作表pd.getExcelSheeet (sql,templatefile) ;

// 新建以文件outputfile 为目标的输出文件流

FileOutputStream fos = new FileOutputStream (outputfile) ;

//将工作簿写入输出文件流,得到输出报表文件

pd.exportExcel (fos) ;

} catch (Exception e) {

e.printStackTrace () ;

} finally {

try {fos.close () ;

} catch (Exception e) {

e.printStackTrace () ;

}}

return mapping.findForward (" success") ;

}}

2.3 设计业务处理类ExcelPoi

package databaseUtil;

import java.io.*;

import java.sql.*;

import java.util.*;

import org.apache.poi.hssf.usermodel.*;

public class ExcelPoi {

private int columNumber = 0;

private int cellNumber=0;

private HSSFWorkbook workbook = null;

private HSSFSheet worksheet=null;

public ExcelPoi (int columNumber)

{this.columNumber=columNumber;}

<! sql:传入参数,实现输出数据查询,templatefile:传入参数,Excel 模板的存放路径-->

public void getExcelSheeet ( String sql,String templatefile)

throws SQLException

{try {

//新建以文件templatefile 为源文件的输文件流,而后从中取得模板文件templatefile 的当前工作簿

workbook = new HSSFWorkbook ( new FileInputStream

(templatefile)) ;

} catch (FileNotFoundException e) {

e.printStackTrace () ;

} catch (IOException e) {

e.printStackTrace () ;}

//取得当前工作簿中的天津大学工程项目库管理系统工作表

worksheet=workbook.getSheet (" 天津大学工程项目库管

理系统") ;

//载入数据库驱动,获得数据库的连接,数据库名为tj,用户名swm, 密码adminClass.forName ( " com.microsoft.jdbc.sqlserver.SQLServerDriver") .newInstance () ;

dbConn = DriverManager.getConnection (" jdbc:microsoft:

sqlserver://localhost:1433;DatabaseName =tj" , " swm" , "

admin") ;

statement = dbConn.createStatement (ResultSet.

TYPE_SCROLL_INSENSITIVE,ResultSet.

CONCUR_UPDATABLE) ;

//SQL 为参数,执行数据查询

ResultSet rs = statement.executeQuery (sql) ;

int rowIndex = 4;

while (rs.next ())

{ List list = new ArrayList () ;

//将查询得到的每行数据放入list

for (int i = 1;i <= columNumber;i++)

{list.add (rs.getString (i)) ; }

//调用createTableRow list 中数据写入worksheet 的第rowIndex

createTableRow (worksheet,list, (short) rowIndex) ;

rowIndex++;}}

<! -list 数据创建当前工作表的第rowIndex 行,并将该行非String 数据累加到合计行行-->

public void createTableRow ( HSSFSheet worksheet1,List list,short rowIndex)

{//getRow (3) 取得工作表的第四行,即合计行(行数从0 开始)

HSSFRow sumrow = worksheet1.getRow (3) ;

for (short i = 0;i < list.size () ;i++)

{ HSSFCell cell = sumrow.getCell (i) ;

//list 1234678 列之外(这几列为String 类型不进行合计),其它列数据累加到合计行的对应列单元中

if (! (i==0||i==1||i==2||i==3||i==5||i==6||i==7)) {

cell.setCellValue ( list.getNumericCellValue ( ) + ( double)

Integer.parseInt ((String) list.get (i))) ;

}}

//创建当前工作表的新行,等待放入数据

HSSFRow row = worksheet1.createRow ( ( short)rowIndex) ;

//在新创建行中创建各列单元格,并将list 中对应数据写入

for (short i = 0;i < list.size () ;i++)

{HSSFCell cell = row.createCell ((short) i) ;

cell.setEncoding (HSSFCell.ENCODING_UTF_16) ;

cell.setCellValue ((String) list.get (i)) ; }

<! --该函数将存储了数据的模板文件导出到输出文件流,创建一个新的报表-->

public void exportExcel ( OutputStream os) throws

IOException

{worksheet.setGridsPrinted (true) ;

workbook.write (os) ;

}}

3 结语

对于一些要求非常苛刻的报表输出可以借助于一些第三方插件,比如水晶报表在实际中可以随心所欲地构建报表模板,而后通过程序控制将需要导出的数据导出到报表中,关键在于如何精确地控制数据导出的位置,保证数据在报表中的准确的位置,这是需要格外注意的








了解Java报表工具就从这里开始
posted on 2012-04-25 10:26 season 阅读(570) 评论(0)  编辑  收藏 所属分类: Java报表—技术知识

只有注册用户登录后才能发表评论。


网站导航: