1. 引入easyExcel的maven地址
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.3</version>
</dependency>
2. 建立导出用到的数据实体类
package com.excel.excel.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@ContentRowHeight(17) //文本行高度
@HeadRowHeight(20) //标题高度
@ColumnWidth(20)//行宽
@Data
public class User {
@ExcelProperty(value = "用户姓名", index = 0)
private String userName;
@ExcelProperty(value = "密码", index = 1)
private String password;
@ExcelProperty(value = 电话号码", index = 2)
private String telephone;
@ExcelProperty(value = 创建日期", index = 3)
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
private Date createDate;
}
3. 控制层代码 此方式为浏览器直接下载 想下载到本地看第4步
package com.excel.excel.test;
import com.alibaba.excel.EasyExcel;
import com.excel.excel.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@RestController
public class TestController {
@RequestMapping("/test1")
public void test(HttpServletResponse response) throws IOException {
//此处改成你service层获取到的数据的List
List<User> userList = service.getAllUserList();
response.setContentType("application/vnd.ms-excel");
// 对响应客户请求进行重新编码
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("测试导出", "utf-8");
// 为导出文件设置默认名称,这里是测试导出
response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
EasyExcel.write(response.getOutputStream(), User.class).sheet("测试页").doWrite(userList);
}
}
4. 导出下载到本地
@RequestMapping("/test2")
public void test2() throws IOException {
//此处改成你service层获取到的数据的List
List<User> userList = service.getAllUser();
EasyExcel.write("D:/test.xlsx", User.class).sheet("测试页").doWrite(userList);
}
=============================结束=============================
小拓展:
定义easyExcel导出的实体类属性时,如果是时间类型的,请使用Date,否则会报错!如果非得用LocalDateTime,那么请往下看。
1. 新建时间类型的转换器类(直接copy代码即可)
注意要实现的是com.alibaba.excel.converters.Converter
接口,别引用错包了!
public class LocalDateTimeConverter implements Converter<LocalDateTime> {
@Override
public Class<LocalDateTime> supportJavaTypeKey() {
return LocalDateTime.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@Override
public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
2. 在实体类时间属性上进行引用即可
@ExcelProperty(value = "创建时间", index = 0,converter = LocalDateTimeConverter.class)
private LocalDateTime date;
附上常用的注解:
注解名称 作用范围 属性 默认值 描述
@ColumnWidth 类或属性 value(int) -1 设置表格的列宽
@ContentRowHeight 类 value(int) -1 设置表格的高度(不含表头)
@HeadRowHeight 类 value(int) -1 设置表格表头的高度
@HeadFontStyle 类或属性 fontName(String) 宋体 设置表格表头的字体
fontHeightInPoints(short) 14 设置表格表头字体的大小
@ExcelIgnore 属性 无 转化表格时忽略该字段
@ExcelIgnoreUnannotated 类 无 转化表格时忽略所有未注释的字段
@ExcelProperty 属性 value(String[]) {""} 说明属性对应表头的名称
index(int) -1 说明属性在表格的位置
converter(Class<? extends Converter>) AutoConverter.class 自定义转换类
@DateTimeFormat 属性 value(String) "" 设置转化格式
use1904windowing(boolean) false 是否使用1904年日期系统