1、为什么使用Excel模板。
当导出的的Excel表格样式比较复杂时,如果使用代码导出就会十分复杂。因此,可以先定义一个Excel模板,然后通过EasyPOI的模板指令快速导出。
2、EasyPOI模板指令。
- 空格分割
- 取值:{{参数名}}
- 三目运算 {{test ? obj:obj2}}
- n: 表示 这个cell是数值类型(obj必须是数字,否则报错,可以与fn结合使用 -- {{n:fn:("100";###.00)}}):{{n:obj}}
- le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
- fd: 格式化时间(将数据-obj格式化成指定时间格式的数据) {{fd:(obj;yyyy-MM-dd)}}
- fn: 格式化数字(将obj格式化成;后边的数值格式) {{fn:(obj;###.00)}}
- fe: 遍历数据,创建row
- !fe: 遍历数据不创建row
- $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
- #fe: 横向遍历
- v_fe: 横向遍历值
- !if: 删除当前列 {{!if:(test)}}
- 单引号表示常量值 '' 比如'1' 那么输出的就是 1
- &NULL& 空格
- ]] 换行符 多行遍历导出
- sum: 统计数据
整体以{{指令}}为基础,与EL表达式类似。
3、代码
public class Test {
public void export(HttpServletResponse response) {
try {
// 1、获取Excel模板
TemplateExportParams params = new TemplateExportParams("static/excelTemplate/test.xls");
// 2、封装导出数据(基于map集合)
Map<String, Object> map = new HashMap<>();
map.put("date", System.currentTimeMillis());
List<Person> personList = new ArrayList<>();
Person person = new Person();
person.setIndex(1);
person.setName("张三");
person.setAge(26);
person.setSex("男");
personList.add(person);
map.put("maplist", personList);
// 3、封装数据到Excel
Workbook workbook = ExcelExportUtil.exportExcel(params, map);
// 4、导出Excel
workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Report export failed");
}
}
}
4、Excel模板。
注意:
- 使用fe循环时,{{fe: 集合名称 第一个参数在第一个单元格;最后一个元素}}在最后一个单元格;中间元素获取不需要使用{{}}。
- 如果集合中存放的元素是对象,那么可以这样:t.元素.属性
- 单元格中使用了{{n:obj}}后,obj必须是数值,,否则会报错,因此可以与 fn:(obj;###) 结合使用。