try
{
Class.
forName
(
"oracle.jdbc.driver.OracleDriver"
);
conn
=DriverManager.
getConnection
(
url
,
"gaps32"
,
"gaps32"
);
Map
beans =
new
HashMap
();
ReportManager rm =
new
ReportManagerImpl(
conn
, beans );
beans.put(
"rm"
, rm)
;
XLSTransformer transformer =
new
XLSTransformer();
transformer.transformXLS(
report
, beans,
reportDest
);
conn
.close();
}
catch
(ClassNotFoundException e1) {
e1.printStackTrace();
}
catch
(SQLException e2){
e2.printStackTrace();
}//. . .
图.8 模板文件
图.9 生成的Excel
4.2 依赖查询
如果使用jdbc的数据库驱动话,你可以给ReportManagerImpl传递任何SQL语句,你可以把在一个查询中使用另一个查询的结果,你可以把一个查询的结果放到bean上下文中,当在依赖查询需要使用这个结果的时候就可以使用了。依赖查询(子查询)典型的用法可以用在两个jx:forEach标签,当其中一个标签嵌套在令一个标签里面的时候,下面是一个简单的例子:
<jx:forEach items="${rm.exec('SELECT d.name, d.id FROM department d')}"var="dep">
Department:${dep.name}
Name |Payment | Bonus | Total
<jx:forEach items="${rm.exec('SELECT name,age, payment, bonus, birthDate FROM employee e where e.depid = ' +dep.id)}" var="employee">
${employee.empname}|${employee.payment}|${employee.bonus}|$[B23*(1+C23)]
</jx:forEach>
</jx:forEach>
在这里我们把第一次查询到的department信息放到上下文中以dep作为key,然后在内部的jx:forEach标签中使用
<jx:forEachitems="${rm.exec('SELECT name, age, payment, bonus, birthDate FROMemployee e where e.depid = ' + dep.id)}" var="employee">
JXLS会替换掉当前处理的部门的id值以便于能查询到当前部门的所有员工
4.3 查询语句包含参数
前面的例子已经显示了如何使用内部SQL查询参数,此外,我们还可以使用外部参数,如果我们把它放在bean上下文中。
Map beans = new HashMap();
ReportManager reportManager = new ReportManagerImpl(conn, beans );
beans.put("rm", reportManager);
beans.put("minDate", "1979-01-01");
XLSTransformer transformer = new XLSTransformer();
transformer.transformXLS(templateFileName, beans,destFileName);
上面我们把日期“1979-01-01”放到bean的上下文中,以minDate作为key,下面我们使用它来构建一条查询语句:
<jx:forEachitems="${rm.exec("SELECT d.name depname, e.name empname, age,payment, bonus, birthDate FROM employee e, department d WHERE d.id = e.depidAND birthDate > '1975-01-01' AND birthDate < '" + minDate + "'order by age desc")}" var="employee">
你要可以从上面的语句中了解到如何在SQL查询语句中使用单引号。
4.4 JDBC结果集
虽然JXLS没有为JDBC查询结果集设计的数据出口,但是查询结果集可以使用Commons BeanUtils的动态类很容易进行输出,XLSTransformer有两种方法可以导出结果集中的数据,第一种使用org.apache.commons.beanutils.RowSetDynaClass,第二种是基于类net.sf.jxls.report.ResultSetCollection。
4.4.1基于RowSet的输出
当你构建一个org.apache.commons.beanutils.RowSetDynaClass类的实例的时候,底层数据被复制到内存中的动态bean集合中,这个集合就代表结果,所以你可以马上关闭结果集,通常当你处理实际数据之前,结果集就已经关闭了,这种方法的缺点就是你必须消耗一定的性能和内存来复制这些结果数据。
使用这种方法首先你必须构建一个新的RowSetDynaClass的实例,并把结果集传递给它。
ResultSetresultSet = ...
RowSetDynaClassrowSet = new RowSetDynaClass(resultSet, false);
第二个构造函数的参数表示属性名称在动态bean的结果集中不应该小写。在你初始化RowSetDynaClass的实例之后,你可以调用它的getRows()方法来获得动态bean的结果集,并用通常的方法输出。
Map beans = newHashMap();
beans.put("employee", rowSet.getRows() );
XLSTransformertransformer = new XLSTransformer();
transformer.transformXLS(templateFileName, beans, destFileName);
下面是一个实例:
Statement stmt =
conn
.createStatement();
String query =
"SELECT * FROM SAI"
;
rs
= stmt.executeQuery(query);
Map
beans =
new
HashMap
();
RowSetDynaClass rsc =
new
RowSetDynaClass(
rs
,
false
);
beans.put(
"employee"
, rsc.getRows())
;
XLSTransformer transformer =
new
XLSTransformer();
transformer.transformXLS(
report
, beans,
reportDest
);
conn
.close();//…
图.10模板文件
图.11生成Excel文件
4.4.2 结果集输出
如果你不想在内存中加载所有的结果集数据,并同意在处理数据的时候一直保持数据库连接不断开的话,你可以使用net.sf.jxls.report.ResultSetCollection类,这个类以ResultSet(结果集)为参数并实现了Collection接口来操作底层数据,反过来ResultSetCollection使用org.apache.commons.beanutils.ResultSetDynaClass来返回检索到的数据作为动态对象。
下面是
net.sf.jxls.report.ResultSetCollection
类的使用:
ResultSetCollectionrsc = new ResultSetCollection(resultSet, false);
beans.put("employee", rsc );
第二个构造函数的参数,表明属性名称在处理之前不应该小写。
下面是一个实例:
Class.
forName
(
"oracle.jdbc.driver.OracleDriver"
);
conn
=DriverManager.
getConnection
(
url
,
"gaps32"
,
"gaps32"
);
Statement stmt=
conn
.
createStatement
(ResultSet.
TYPE_SCROLL_INSENSITIVE
,ResultSet.
CONCUR_READ_ONLY
);
String query =
"SELECT NAME, AGE, PAYMENT, BONUS, IDFROM SAI"
;
rs
= stmt.executeQuery(query);
Map
beans =
new
HashMap
();
ResultSetCollection rsc =
new
ResultSetCollection(
rs
,
false
);
beans.put(
"employee"
, rsc )
;
XLSTransformer transformer =
new
XLSTransformer();
transformer.transformXLS(
report
, beans,
reportDest
);
注:不能使用
Statement stmt=
conn
.
createStatement
();
不然会出现异常(对只转发结果集的无效操作: last "的异常)应该使用
Statement stmt=
conn
.
createStatement
(ResultSet.
TYPE_SCROLL_INSENSITIVE
,ResultSet.
CONCUR_READ_ONLY
);
分析:异常出现于移动结果集的指针时,原因是在生成statement对象的时候提供的参数不同无参数的那个方法使用的是默认参数,statement执行后得到的结果集类型为
ResultSet.TYPE_FORWARD_ONLY.
这种类型的结果集只能通过rs.next();方法逐条读取,使用其他方法就会报异常. 如果想执行一些复杂的移动结果集指针的操作就要使用其他参数了
图.12模板文件
图.13生成的Excel文件
4.5 在报表中插入图表
List
staff =
new
ArrayList
();
staff.add(
new
Employee(
"Derek"
, 35, 3000, 0.30))
;
staff.add(
new
Employee(
"Elsa"
, 28, 1500, 0.15))
;
staff.add(
new
Employee(
"Oleg"
, 32, 2300, 0.25))
;
staff.add(
new
Employee(
"Neil"
, 34, 2500, 0.00))
;
staff.add(
new
Employee(
"Maria"
, 34, 1700, 0.15))
;
staff.add(
new
Employee(
"John"
, 35, 2800, 0.20))
;
staff.add(
new
Employee(
"Leonid"
, 29, 1700, 0.20))
;
Map
beans =
new
HashMap
();
beans.put(
"employee"
, staff)
;
XLSTransformer
transformer =
new
XLSTransformer
();
transformer.markAsFixedSizeCollection(
"employee"
);
transformer.transformXLS(
templateFileName
, beans,
destFileName
);
源码文件和普通的文件一样。
图.14模板文件
在Excel模板中插入图表,在工具栏选插入-----图表,然后选择图表的类型,有柱状图,饼状图等等,插入后,选中图表右击选择“选择数据”然后对图表中的数据进行设置,(横轴和水平轴)插入图表有一个缺陷,图表中的数据条数要固定,而且要预先设置好,不能在运行的时候确定,然后如果数据量太大的话,显示会很拥挤。
使用
jxls
Reader
读取
excel
报错
Jxls
Reader.read(INTERPRETATION_DATA_IMPORT_XML,
excel
.getAbsolutePath(), beans);
报错为:找不到CellType方法,但是在/apache/poi/ss/usermodel/CellType中确实又存在
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested except
官方给的
JXLS
读取
excel
文件的例子
本文示例代码下载地址
jXLS
提供
jxls
-reader 模块用来
读取
XLS 文件并且用读来的表格数据填充 Java bean。
使用
jXLS
来解析 cxcel 文件并使用读来的数据填充 Java 对象我们首先要创建一个 XLSReader 对象。要创建这个对象,最简单的方法就是使用一个 XML 配置文件。在本文的示例代码中,我们使...
一.
JXLS
简介
在很多涉及到某种报表功能的Java程序中都需要生成
Excel
表格。目前通过Java来
操作
.xls文件最完整的类库是Apache POI类库,但是当需要创建多种自定义的复杂
Excel
报表的时候就会出现问题,这些
Excel
报表一般都带有多种格式和可扩展功能,在这种情况下,你就不得不写一大堆Java代码来创建报表的规则集(workbook),规则集一般包含所有要求的格式,公式,其他特
jxls
-Reader技术解析
EXCEL
jxls
-Reader 技术,用于
读取
excel
中的数据,把数据映射到JavaBean,xml配置文件用于解析
excel
文件,解决如何填充的问题:
提示: 目标要构建 xlsReader对象,构建xlsReader对象的最简单的方式,是使用特定的xml配置文件
① 创建JavaBean
package com.wuhao.entity;
import java.util.Date;
* @author: wuhao
* @sin.
jx:each(items=“result” var=“v” lastCell=“AX2”)
批注:jx:each(items=“v.csDetail” var=“cs” lastCell=“AV2”)
后面连个再次循环的非合并列放在合并列中间时,当出现有一个List为null或者为0时会出现数据错误的问题,不截图了~
把他放到最后去,懒得去写if判断了(单个List没...
var is a name of the variable in
Jxls
context to put each new collection item when iterating
items is a name of a context variable containing the collection (
InputStream inputStream = null;
try {
inputStream = new ClassPathResource("
jxls
_templates/export-scheduler-report.xls").getInputStream();
} catch (IOException e2) {
e2.printStackTrace();
XLSransformer + 模板 导出 EXCAL准备一个EXCAL模板模板标签jx:if标签标签的典型用法如下jx:outline标签jx:out标签jx:forEach标签使用jx:forEach标签对数据进行分组筛选收集项目varStatus属性通过模板导出EXCAL
官网链接:http://
jxls
.sourceforge.net/
准备一个EXCAL模板
新建一个EXCAL模板文件,在模板文件中写好相应的列头,也可以使用组织的参数循环生成,模板中可以设置字文本框,字体等样式(使用和正常
操作
EX