jxls读取模板导出Excel学习笔记
jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。除此以外,java中成熟的excel导出工具有poi、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。
jxls的运行效率相对于 jxl、poi要慢,但导出数据量较小的时候使用它,可以加快编码的速度,毕竟用起来简单方便。
源码方法
最核心的方法是 jxls-core 的jar包中XLSTransformer 类,里面有transformXLS() 重载的三种形式,我只摘出了方法签名部分,如下:
/** 参数1:模板文件路径
* 参数2:填入表格的对象数据
* 参数3:输出文件的路径
* 这个方法读取模板,写入数据,写入输出文件一起完成
*/
public void transformXLS(String srcFilePath, Map beanParams, String destFilePath)
/** 参数1:模板文件输入流
* 参数2:填入表格的对象数据
* 返回工作簿对象,后续的write()写入输出文件流需要手动进行
*/
public Workbook transformXLS(InputStream is, Map beanParams)
/** 与第二个方法类似,返回工作簿对象,后续的write()写入输出文件流需要手动
* 进行。看起来应该是支持往多个sheet页中填入数据
*/
public Workbook transformXLS(InputStream is, List templateSheetNameList, List sheetNameList, List beanParamsList)
编码使用
定义好要填入表格的对象,通过beanParams传入transformXLS()
Map<String,Object> map = new HashMap<String,Object>();
map.put("department", MyDepartment);
transformer.transformXLS(srcFilePath, map, destFilePath);
编写excel输出格式
a. 使用下面的语句来访问Excel单元格中简单的bean属性:
${department.name} // 注意department是Map中的key
Map中可以放多个队形,每个对象用各自的 name.perproty 访问即可。
访问任何深度的对象属性都是可以的。例如
${bean.bean1.bean2.bean3.bean4.bean5.bean6.bean7}
b. 多个属性在一个单元格中在一个单元格,我们可以连接几个属性。例如:
Employee: ${employee.name} - ${employee.age} years old
这样,我们得到的输出是:
Employee: John - 35 years
c. : 用于迭代, 属性有2个, 一个是items, 一个是var, 类似java中的foreach循环,items表示集合,var表示集合中的单个对象。
如果你把jx:forEach标签的开始标签和结束标签放在同一行的话,JXLS会在同一行上重复在jx:forEach
标签的开始标签和结束标签之间的Excel单元格。 如果你想要用jx:forEach标签重复Excel的行,那么你必须把jx:forEach标签的开始标签和结束标签放在不同的行,把要重复的行包含在中间,jx:forEach标签本身所在行的所有单元格都会被忽略。
forEach标签的筛选功能 : 你可以用jx:forEach标签的‘select’属性来选择把哪些记录包含在循环中,例如,如果我们想只包含工资高于 2000元的员工,我们可以使用下面的语句:
<jx:forEach items="${employees}" var="employee" select="${employee.payment > 2000}">
{employee.name} | {employee.payment} | ${employee.bonus}
</jx:forEach>
items的值,employees对应放入map中的key,value是我们的数据对象。
1.2 示例
a. bean
public class Fruit {
private String name; // 水果名称
private float price; // 水果价格
// getter setter
}
b. 核心工具类
public class ExcelUtil {
/**
* 根据模板生成Excel文件.
* @param templateFileName 模板文件.
* @param list 模板中存放的数据.
* @param resultFileName 生成的文件.
*/
public void createExcel(String templateFileName, List<?> list, String resultFileName){
try {
//创建XLSTransformer对象
XLSTransformer transformer = new XLSTransformer();
//获取java项目编译后根路径
URL url = this.getClass().getClassLoader().getResource("");
//得到模板文件路径
String srcFilePath = url.getPath() + templateFileName;
Map<String,Object> map = new HashMap<String,Object>();
map.put("list", list);
String destFilePath = url.getPath() + resultFileName;
//生成Excel文件
transformer.transformXLS(srcFilePath, map, destFilePath);
} catch (Exception e) {
throw new RuntimeException("error happens...", e);
}
}
}
c. 测试类
public class Client {
public static void main(String[] args) {
List<Fruit> list = new ArrayList<Fruit>();
list.add(new Fruit("苹果",20.0f));
list.add(new Fruit("桔子",30.0f));
String templateFileName = "template.xlsx";
String resultFileName = "result.xlsx";
new ExcelUtil().createExcel(templateFileName,list,resultFileName);
}
}
d. Excel表格
模板表格
导出的表格