jxl 另一种用法

   jxl 是对 Excel操作的一组API,可以对Excel新建,修改等其它操作,但在开发时难免要写代码。
  最近本人在公司写了一个控件叫EP,就是对其jxl底层包装,开发时不用写jxl代码,就能生成Excel报表。根据jxl 修改Excel文件特性开发出来的。根据定义好的模板,在模板定义坐标,然后根据坐标填写打包数据。最后生成模板附件。此控件类似 Irport
   由于此控件(EP)是公司的,不便发上。
   在此发此文章,也是为因为本人能力有限,写出来的EP局限性太大,在此,本人只是提拱此想法,希望高手能够开发出更好控件以便造福大家。发上本人开发EP 功能描述

 
 
EP 2.0 功能描述

一.开发目的
相信公司各组都有用过JXL来开发Excel报表吧,
开发EP功能包只是为了提高公司开发效,节省时间,统一管理

二.功能主要概述
EP是封装JXL代码JAVABEAN,底包是JXL,让开发者只须对EP调用,无须关心
JXL代码。EP框架来源启发于Irport,调用也相似Irport,,用法请参考功能应用

三.功能主要特点
1. 只能开发Excel报表,生成Excel文件
2. 模板支持图片,不过只支持PNG 图片
3. 开发简捷,只须封装数据,加上模板操作
4. 不支持动态列报表(3.0 会考虑加上此功能)
5. 有分页功能,支持按不同字段进行分组分页等功能

四.功能应用描述
开发时只须对 ExcelPrint 类调用加上模板操作
1.类调用代码
ExcelPrint ep = new ExcelPrint("F:", "Test.xls", "F:", "Test1.xls"); //实例化
ep.setGroupBy("a"); //按 a 字段分组 ,可以不设置
ep.print(head, details, footer); //调用生成Excel文件
//head 头区数据
//details 循环区数据 调用时不能为空,如果为空,抛错
//footer 尾区数据
2.模板介绍与操作
  (附件1.jpg)
·(如上图)模板分三个区:头区,循环区,尾区
1. 头区用{SH,EH} 做为开始与结束,它是打印报表头设置,设计时可以不定义
有效变量:$F,$G,$V (变量定义,请看变量说明)
它是根据有效变量来填充ep.print(head, details, footer)的head的数据
2. 循环区用 {SD,ED}做为开始与结束,它是最主要区,设计时一定要定义
有效变量:$F
它是负责循环填写ep.print(head, details, footer)的details的数据
它至少要有一个子循环区,子循环区用 {SL,EL}做为开始与结束
子循区是根据$F变量来循环填充details的每个Object
3. 尾区用{SF,EF}做为开始与结束,它是打印报表尾部设置,设计时可以不定义
有效变量:$F,$G,$V
它是根据有效变量来填充ep.print(head, details, footer)的footer 的数据
·变量
变量是模板填充数据所定义的变量名
暂时模板可以定义有效变量为:$F,$G,$V
$F:外部变量,所谓外部是指从head, details, footer 所取的有GET的变量
$V:内部变量,内部是指内部已经标准化的变量,暂时只有两个可以用
$V{page}每页页数,$V{pageSum}总页数
$G:分组变量,分组是指当有分组功能时,拿得同一分组相同的数据
l 有效数据类型
数据类型是指头区,循环区,尾区数据元素Object getX 变量定义时数据类型
有效数据类型包括:java.lang.String, java.math.BigDecimal, java.lang.Integer
java.lang.Double, java.util.Date
·举例与应用
一.引入包
1. 把ep2.0.jar 引入工程,如果工程已存在jxl.jar就必须把它删除,也
必须把ep1.0 代码删除
2. ep2.0.jar 已包含ep1.0 功能,只是调用方法不同,也不影响
已经用ep1.0 做好的报表,已兼容
二.例子说明,如下模板和代码进行说明

java 代码
  1. public static void main(String args[]){   
  2. try {   
  3. Object[] deatils = new Object[3];   
  4. for(int i=0;i TestObject deatil = null ;   
  5. deatil = new TestObject();   
  6. deatil.setD(new java.util.Date());   
  7. deatil.setB("B"+i);   
  8. deatil.setC(new Double(67.00d+i));   
  9. deatils[i] = deatil ;   
  10. }   
  11. Object[] heads = new Object[1];   
  12. TestObject head = new TestObject();   
  13. head.setA("sdfdsf");   
  14. heads[0] = head;   
  15. Object[] footers = null ;   
  16. ExcelPrint ep = new ExcelPrint("F:""Test.xls""F:""Test1.xls");   
  17. //ep.setGroupBy("a");   
  18. ep.print(heads, deatils, footers);   
  19. }catch (Exception ex) {   
  20. System.out.println(ex.getMessage());   
  21. }   
  22. }   


 (附件2.jpg)
模板
代码
ExcelPrint ep = new ExcelPrint("F:", "Test.xls", "F:", "Test1.xls");
//ep.setGroupBy("a");
ep.print(heads, deatils, footers);
是实例化一个EP控件,然后调用生成Excel文件实例化时同时可以传入模板
路径,模板文件名,生成路径,生成文件名,也可以不设,实例化后用set()传入也可以。
模板路径:是摆放模板实际路径
模板文件名:是调用模板文件实际文件名,扩展名(xls)一定要给
生成路径:是根椐模板生成Excel文件后摆放的实际路径
生成文件名:是根据模板生成Excel文件所保存的文件命名,不用扩展名,会自动
加上xls扩展名
setGroupBy 设置按details 数据不同来分页,可以不设置,如果要调用此功能,必须
details数据是按setGroupBy 字段先OrderBy才生效,如上代码//ep.setGroupBy("a");
是按details Object getA()不同来分页
print方法中的参数与模板各个区域对应
heads 对应模板头区({SH/EH}) heads 是Object数组,它每一个元素对应模板每一页
头区,如果当页元素为空,哪么当页模板头区就拿 heads Object第一个元素,
details 对应模板循环区({SD/ED}),details是Object数组,它每一个元素对应
模板循环区中每一个子循环区({SL/EL}),循环到最后一个子循环区就自动分页。
从模板图上看,定义了两个子循环区,哪么其实从整个循环区就不只有两个子循环区
如图,定义第一个子循环区所派生子循区其实才是循环区第二个子循环区,如果模板
规格一样只须定义一个子循环区就可以了,以上模板之所以定义两个子循环区是因为
第二个定义子循环区与它上面所定义规格不一样,因为它有合并格
footers对应模板尾区({SF/SF}) footers是Object数组,它每一个元素对应模板每一页
尾区,如果当页元素为空,哪么当页模板尾区就拿 footers Object第一个元素
以上数据每个元素必须有getX()方法与之模板$F{X},$V{X},$G{X}相对应
如上循环区定义了变量$F{d},哪么数据中details 每个元素就必须要有getD()方法才能
在模板填充到数据值
用图表来表示如下图所示: 

头数据heads

heads[0]

heads[1]==null 或没有heads[1]就拿heads[0]

模板头区域{SH/EH}

第一页{SH/EH}

第二页{SH/EH}

<o:p> </o:p>第一页

循环区数据details

details[0]

details[1]

details[2]

模板循环区域{SH/EH}

第一个{SL/EL}

<v:line id="_x0000_s1026" style="Z-INDEX: 1; LEFT: 0px; POSITION: absolute; TEXT-ALIGN: left; mso-position-horizontal-relative: text; mso-position-vertical-relative: text" to="-1.55pt,65.8pt" from="-1.55pt,11.2pt"><v:stroke endarrow="block"></v:stroke></v:line>第二个{SL/EL}

第三个{SL/EL}

如果第一页为三个子循环区,details超出三个   元素,就分页,如图

<o:p> </o:p>第二页

循环区数据details

details[3]

details[4]

details[5]

模板循环区域{SH/EH}

第一个{SL/EL}

第二个{SL/EL}

第三个{SL/EL}

<o:p> </o:p>

尾数据heads

footers [0]

footers [1]==null 或没有footers [1]就拿footers [0]

模板尾区域{SH/EH}

第一页{SF/EF}

第二页{SF/EF}


根据以上代码和模板所生成文件如下图:

 (附件3.jpg)

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值