本章通过POI 和 JXLS 各个技术 ,分别应用于项目中
[TOC]
写入Excel的两种技术
目标 , 将前端的数据写入excel , 供管理者决策
一 . POI技术
POI 中,使用:XSSF - 提供读写Microsoft Excel OOXML
XSSFWorkbook:工作簿
XSSFSheet:工作表
XSSFRow:行
XSSFCell:单元格
- 创建工作簿的时候, 不需要传入参数(excel不存在的)
- 使用输出流,输出excel
读取Excel, 每一行读取到了String[] 里面, 多行就是多个String[] , 最终封装到List
代码实现
1 | //方式一:利用POI技术将前端数据挨个写入到excel的单元格 |
二. JXLS
代码实现
1 | //方式二:利用JXLS技术将前端数据挨个写入到excel的单元格 |
(1) . JXLS简介
JXLS是实现了只用几行代码就能创建极其复杂的Excel报表。用特定的标记来创建一个带有规则的.xls模板文件 , 并指定数据放置的位置 , 然后调用JXLS引擎来传递导出的数据放在指定的位置。除了生成Excel报表功能,JXLS还提供了jxls-reader模块,jxls-reader模块会很有用,如果你需要解析一个预定义格式的Excel文件并在其中插入数据的话。
(2).JXLS安装
为了使用JXLS引擎,你必须把jxls-core.jar添加到项目的classpath,如果计划使用JXLS来读取.xls文件,那么你必须还要把jxls-reader.jar加入到项目的classpath中。
引入Maven依赖
1 | <dependency> |
(3).JXLS用法
1. 属性访问
1 | Map<String,Object> result = new HashMap<>(); |
访问Excel单元格中简单的bean属性:
1 | ${reportDate}//多级 , 就 benas.beans1 .beans2 .Filed |
reportDate属性的值会被映射到Excel单元格中。
2. 多属性遍历
1 | <jx:forEach items="${X}" var="Y" > |
筛选功能
‘select’属性来选择把哪些记录包含在循环中,例如,< 1的数,我们可以使用下面的语句:
1 | <jx:forEach items="${X}" var="Y" select="${Y.Z > 1}"> |
varStatus 属性
varStatus属性用来定义一个循环状态的名字,在每一次迭代中,循环状态对象会被传递到bean上下文。循环状态对象是LoopStatus类的一个实例,LoopStatus类有一个单一(静态)的’index’属性用来确定当前记录在集合中的索引值(索引值从0开始)。
1 | <jx:forEach items="${X}" var="Y" varStatus="status"> |
3. 条件判断
1 | <jx:if test="${X.Filed > 2000.0}"> |
jx:if标签可以基于某些条件来排除某些行或是某些列
如果你把jx:if标签的开始标签和结束标签放在同一行的话,JXLS会根据test的条件来处理或删除包含在标签提内的列;
如果你把jx:if标签的开始标签和结束标签放在不同行的话,JXLS会根据test的条件来处理或删除包含在标签提内的行。
4. 折叠
jx:outline标记有一个可选的布尔类型的属性“detail”声明结果初始化的状态-它们应该展开显示还是折叠显示,默认值是false即分组的行会被折叠显示(隐藏)
1 | <jx:out> |
5. 融合SQL
执行SQL查询,并在Excel文件中显示查询结果,你必须在模板进行转换之前把一个特殊的bean写入bean上下文,这个特殊的bean要实现ReportManager接口。目前这个接口只有一个方法:
1 | public Listexec(String sql) throws SQLException |
这个方法的参数是一个SQL查询语句,执行结果,返回一个list(list的泛型是bean)
JXLS对这个接口提供了一个默认的实现,叫做ReportManagerImpl,ReportManagerImpl使用owSetDynaClass来把ResultSet对象封装到对象集合中,下面是这个类的用法:
1 | Map beans = newHashMap(); |
可以执行任何SQL查询语句通过把它作为参数传递给rm.exec()方法,例如:
1 | ${rm.exec("SELECT Filed1, Filed2 FROM X")} |
与 jx:forEach 标签结合起来使用来遍历bean的集合 (ResultSet) 并把它显示在Excel文件中
1 | <jx:forEachitems="${rm.exec('SELECT y.FILED1, y.FILED2, y.FILED3 FROM Y y')}" var="Y"> |
SQL子查询
(子查询)用两个jx:forEach标签,当其中一个标签嵌套在令一个标签里面
1 | <jx:forEach items="${rm.exec('SELECT d.name, d.id FROM department d')}"var="dep"> |
语句包含参数
使用外部参数
1 | Map beans = new HashMap(); |
上面我们把日期“1979-01-01”放到bean的上下文中,以minDate作为key,下面我们使用它来构建一条查询语句:
1 | <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查询语句中使用单引号。