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)

 

你可能感兴趣的:(框架,Excel,F#)