一. JXLS简介
在很多涉及到某种报表功能的Java程序中都需要生成Excel表格。目前通过Java来操作.xls文件最完整的类库是Apache POI类库,但是当需要创建多种自定义的复杂Excel报表的时候就会出现问题,这些Excel报表一般都带有多种格式和可扩展功能,在这种情况下,你就不得不写一大堆Java代码来创建报表的规则集(workbook),规则集一般包含所有要求的格式,公式,其他特定的设置和正确的Java对象集的数据出口。这些代码一般都是难以调试,任务也常常变得容易出错并且耗时。
另外一个问题是有很多Excel组件都没有提供的API。幸运的是POI API读取Excel文件,可以保持它原有的格式,然后根据需要进行修改。很明显,用一些Excel编辑工具来创建所有格式正确的报告模板然后指定真实的数据应该放置的地方,会容易很多。JXLS是实现这种方法并且只用几行代码就能创建极其复杂的Excel报表。你只需要用特定的标记来创建一个带有所有要求的格式,公式,宏等规则的.xls模板文件来指定数据放置的位置然后再写几行代码来调用JXLS引擎来传递.xls模板和导出的数据作为参数。
除了生成Excel报表功能,JXLS还提供了jxls-reader模块,jxls-reader模块会很有用,如果你需
要解析一个预定义格式的Excel文件并在其中插入数据的话。jxls-reader允许你用一个简单的XML文件描述解析规则,读取Excel文件和你的各种JAVA对象(population of your Java objects)的所有其他工作都会自动完成。
二. JXLS安装
为了使用JXLS引擎,你必须把jxls-core.jar添加到项目的classpath,如果计划使用JXLS来读取.xls文件,那么你必须还要把jxls-reader.jar加入到项目的classpath中。
如果你用Maven来构建你的应用程序,你可以在你的l文件中配置指定要求的JXLS模块的依赖,让它们可以从Maven仓库下载。
下面的Apache类库也要求添加到项目的classpath中
●POI 3.6 or higher
●Commons BeanUtils
●Commons Collections
●Commons JEXL
●Commons Logging
●Commons Digester
注意:当前JXLS版本可能无法正常地与较早的POI库版本工作,因此,如果你必须要使用较早版本的POI(prior 3.2)使用较老版本的JXLS就行了
三. JXLS参考
1.简介
这部分描述在.xls模板文件的中的对象属性访问语法,如果想让JXLS引擎进行正确的处理.xls模板文件就必须使用规定的语法。
接下来的部分假设我们有两个相互依赖的JAVA beans,类型分别为Department和Employee,在代码中像这样被传递到XLSTransformer中:
Department department;
... //initialization
Map beans = new HashMap();
beans.put("department", department);
XLSTransformer transformer = new XLSTransformer();ansformXLS(xlsTemplateFileName, beans, outputFileName);
2. 属性访问
2.1.基本属性访问
使用下面的语句来访问Excel单元格中简单的bean属性:
${department.name}
在上面这个语句中,JXLS引擎会通过关键字department在当前bean映射下搜索这个bean,然后会尝试获取这个bean的name属性的值并把它放到相应的Excel单元格中。
同理,我们可以访问更加复杂的属性,例如,要输出这个department中的属性chief中的name属性的值,我们可以用:
${department.chief.name}
访问任何深度的对象属性都是可以的。例如
${bean.bean1.bean2.bean3.bean4.bean5.bean6.bean7.bean8.bean9.beanX.property1}
2.2多个属性在一个单元格中
在一个单元格,我们可以连接几个属性。例如:
Employee: ${employee.name} - ${employee.age} years
这样,我们得到的输出是:
Employee: John - 35 years
其中${employee.name}的值是John,同理${employee.age}的值是35.
3.使用标签
JXLS允许在模板中使用预定义的XML标签来控制XLS转换行为。
3.1 jx:forEach标签
<jx:forEach>标签的典型用法如下:
<jx:forEach items="${departments}" var="department">
${department.name} | ${department.chief}
</jx:forEach>
jx标签可以相互嵌套使用
如果你把jx:forEach标签的开始标签和结束标签放在同一行的话,JXLS会在同一行上重复在jx:forEach标签的开始标签和结束标签之间的Excel单元格。
目前,如果你想要用jx:forEach标签重复Excel的行,那么你必须把jx:forEach标签的开始标签
和结束标签放在不同的行,把要重复的行包含在中间,jx:forEach标签所在行的所有单元格都会被忽略。
以下是一个实例的截图:
图.1模板文件
图.2生成的Excel报表
3.1.2forEach标签的数据分组
jx:forEach标签可以通过一个底层bean的属性对数据集合的分组,这可以通过jx:forEach标签的groupBy and groupOrder属性完成,groupBy用于指定一个属性进行分组,groupOrder用于指定各个分组排列顺序。例如:
<jx:forEach items="${employees}" groupBy="age">
Age: ${group.item.age}
<jx:forEach items="${group.items}" var="employee">
${employee.name} | ${employee.payment} | ${employee.bonus}
</jx:forEach>
</jx:forEach>
在这个例子中,我们把employees按age属性分组,当遇到groupBy属性的时候,JXLS内部执行分组并且放置名为group的新的bean到上下文中,这个新的bean是很简单-它包含两个属性:item属性和items属性,item属性是分组中当前处理的bean;items属性
代表这个分组中所有bean的集合。
正如你看到的,在这个例子中我们首先使用下列语句显示一些关于当前分组age属性的信息
Age: ${group.item.age}
之后,我们使用内部<jx:forEach>标签来实现迭代并显示所有分组中的记录
<jx:forEach items="${group.items}" var="employee">
${employee.name} | ${employee.payment} | ${employee.bonus}
</jx:forEach>
默认情况下,如果没有groupOrder属性组的顺序将被按“原先”的顺序保留,以便这些分组的排列顺序跟原先的集合中一样,如果你需要按升序或是降序排列排列这些分组,那么你可以将groupOrder属性相应地设置为ASC或DESC
在使用groupBy属性的情况下,jx:forEach标签的var属性将被忽略
3.1.3 forEach标签的筛选功能
你可以用jx:forEach标签的‘select’属性来选择把哪些记录包含在循环中,例如,如果我们想只包含工资高于 2000元的员工,我们可以使用下面的语句:
<jx:forEach items="${employees}" var="employee" select="${employee.payment > 2000}">
${employee.name} | ${employee.payment} | ${employee.bonus}
</jx:forEach>
3.14 forEach标签的varStatus 属性
jx:forEach标签支持varStatus属性,varStatus属性用来定义一个循环状态的名字,在每一次迭代中,循环状态对象会被传递到bean上下文。循环状态对象是LoopStatus类的一个实例,LoopStatus类有一个单一(静态)的'index'属性用来确定当前记录在集合中的索引值(索引值从0开始)。
<jx:forEach items="${employees}" var="employee" varStatus="status">
excel连接sql数据库教程${status.index}|${employee.name}|${employee.payment}|${employee.bonus}
</jx:forEach>
3.2 jx:if标签
典型的<jx:if>标签的用法如下:
<jx:if test="${department.chief.payment > 2000.0}">
Chief Name: ${department.chief.name}
</jx:if>
jx:if标签可以基于某些条件来排除某些行或是某些列,如果你把jx:if标签的开始标签和结束标签放在同一行的话,JXLS会根据test的条件来处理或删除包含在标签提内的列;如果你把jx:if标签的开始标签和结束标签放在不同行的话,JXLS会根据test的条件来处理或删除包含在标签提内的行。
3.3 jx:outline标签
<jx:outline>标签可以将特定的行组成一组。例如:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论