使用bootstrap的tableExport仅可导出简单格式的excel文件,导出复杂格式的excel需要使用easyexcel根据模版生成。
需要在pom中导入easyexcel2.1.6和poi3.17依赖。
设置模版:
单行填充使用{name },多行填充使用{.name}
实体类加注解:
public class Student {
@ExcelIgnore
private Integer id;
@ColumnWidth(20)
@ExcelProperty("姓名")
private String name;
@ColumnWidth(15)
@ExcelProperty("年龄")
private String age;
}
@ColumnWidth():设置表头列宽 @ExcelProperty(index,value):index对应表头在第几列,从0开始。value对应表头名称。如果不设置表头默认使用字段名为表头,列顺序按照实体类字段顺序显示。 @ExcelIgnore:忽略扫描此字段,不在excel中填充。
Controller层代码:
@RequestMapping(value = "/exportList")
@ResponseBody
public void exportList(HttpServletResponse response, HttpServletRequest request) throws Exception {
String fileName = "报表";
//获取模版路径
String templateFilePath= "D:\\模版.xls";
//设置响应头内容,以vnd.ms-excel方式打开数据
response.setContentType("application/vnd.ms-excel");
//修改响应头信息
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName + "1.xls"));
//告诉所有浏览器不要缓存
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//设置时间值属性的响应头信息,不要缓存
response.setDateHeader("Expires", -1);
//(设置输出的编码格式)指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding("UTF-8");
//使用模版创建工作簿
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(),Student.class).withTemplate(templateFilePath).excelType(ExcelTypeEnum.XLS).build();
WriteSheet sheet = EasyExcel.writerSheet().build();
//开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为true
FillConfig fillConfig =FillConfig.builder().forceNewRow(Boolean.TRUE).build();
List<Student> infos=null;
infos=waterInfoService.excelExport();
HashMap<String, String> mapFillData = new HashMap<>();
mapFillData.put("date", "2023-4-23");
//单行数据填充
excelWriter.fill(mapFillData,sheet);
//多行数据填充
excelWriter.write(infos,sheet);
//关闭流
excelWriter.finish();
}
EasyExcel.write(response.getOutputStream(),实体类的class).withTemplate(模版路径).excelType(ExcelTypeEnum.XLS).build();
EasyExcel默认excel文件后缀xlsx,如果要使用xls文件,需要设置excelType(ExcelTypeEnum.XLS)。
使用write()方法会自动关闭流,使用fill()方法需要手动关闭流。
生成文件如图: