本站首页    管理页面    写新日志    退出

The Neurotic Fishbowl

[Java报表软件—技术知识]“Java+POI+模板”打造复杂Excel 报表
FineReport——报表技术领跑者 发表于 2012/4/25 10:20:06

 做的Struts 项目中有这样的功能,用户可以将数据导出到Excel 报表,如图1 所示。 500)this.width=500'> 图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 中1、2、3、4、6、7、8 列之外(这几列为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 结语 对于一些要求非常苛刻的报表输出可以借助于一些第三方插件,比如水晶报表等。在实际中可以随心所欲地构建报表模板,而后通过程序控制将需要导出的数据导出到报表中,关键在于如何精确地控制数据导出的位置,保证数据在报表中的准确的位置,这是需要格外注意的。  

阅读全文(1855) | 回复(0) | 编辑 | 精华

 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
 



The Neurotic Fishbowl

.: 公告

本博客提供详细的java报表软件的制作过程,发布java报表软件的版本更新信息,并适时对国内主流报表软件进行功能比较。


Bloginess

«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31

.: 我的分类(专题)

首页(357)
Java报表软件—制作笔记(54)
Java报表软件—功能比较(43)
Java报表软件—使用心得(21)
Java报表软件—行业动态(54)
Java报表软件—新闻资讯(48)
Java报表软件—技术知识(49)
Java报表软件—问题解析(2)


In the Bowl

.: 最新日志

如何对报表的参数控件赋值
java报表工具FineReport常见
报表怎么做 FineReport连接池原
报表怎么做FineReport数据连接之
报表模板之报表设计
报表模板之报表设计


.: 最新回复

回复:报表参数
好好学习,
好好学习,天天向上。买双 air jor
回复:理解FineReport缓存系列2
回复:理解FineReport缓存系列2


The Fishkeeper
blog名称:Java报表软件
日志总数:357
评论数量:69
留言数量:0
访问次数:1213442
建立时间:2006年4月16日



Text Me

.: 留言板

签写新留言

需要你的帮助


Other Fish in the Sea

.: 链接

报表开发工具  html5图表java报表开发工具




站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.252 second(s), page refreshed 144776518 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号