目录
easyExcel
作用:操作excel数据
基本使用easyExcel
1.导入依赖
<!--引入easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.4</version>
</dependency>
注意:使用该版本的easyExcel版本jdk版本最好为8,太高会导致版本不兼容
2.创建pojo类
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private Integer age;
private String addr;
private Date birthday;
}
3.测试
@Test
public void testPerson(){
List<Person>persons=new ArrayList<>();
for(int i=1;i<=10;i++){
Person person = Person.builder().name("赫赫" + i).age(10 + i).addr("北京" + i).birthday(new Date()).build();
persons.add(person);
}
//使用easyExcel导出excel表
EasyExcel.write("D:\\easyExcel\\test.xls", Person.class).sheet("个人信息表").doWrite(persons);
}
设置表头名字
在pojo类的成员变量中使用@ExcelProperty注解
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@ExcelProperty(value = {"名字"},index = 0)
private String name;
@ExcelProperty(value = {"年龄"},index = 1)
private Integer age;
@ExcelProperty(value = {"地址"},index = 2)
private String addr;
@ExcelProperty(value = {"生日"},index = 3)
private Date birthday;
}
合并表头
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@ExcelProperty(value = {"个人的基本信息","名字"},index = 0)
private String name;
@ExcelProperty(value = {"个人的基本信息","年龄"},index = 1)
private Integer age;
@ExcelProperty(value = {"个人的基本信息","地址"},index = 2)
private String addr;
@ExcelProperty(value = {"个人的基本信息","生日"},index = 3)
private Date birthday;
}
设置日期的格式
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@ExcelProperty(value = {"个人的基本信息","名字"},index = 0)
private String name;
@ExcelProperty(value = {"个人的基本信息","年龄"},index = 1)
private Integer age;
@ExcelProperty(value = {"个人的基本信息","地址"},index = 2)
private String addr;
@ExcelProperty(value = {"个人的基本信息","生日"},index = 3)
@DateTimeFormat("yyyy/MM/dd")//设置导出excel的日期的格式
//注意:使用的是com.alibaba.excel.annotation.format.DateTimeFormat
private Date birthday;
}
忽略指定表头的列信息
使用@ExcelIgnore
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@ExcelProperty(value = {"个人的基本信息","名字"},index = 0)
private String name;
@ExcelProperty(value = {"个人的基本信息","年龄"},index = 1)
private Integer age;
@ExcelProperty(value = {"个人的基本信息","地址"},index = 2)
private String addr;
@ExcelProperty(value = {"个人的基本信息","生日"},index = 3)
@DateTimeFormat("yyyy/MM/dd")//设置导出excel的日期的格式
//注意:使用的是com.alibaba.excel.annotation.format.DateTimeFormat
@ExcelIgnore
private Date birthday;
}
设置单元格大小
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@HeadRowHeight(value = 35) // 表头行高
@ContentRowHeight(value = 25) // 内容行高
@ColumnWidth(value = 50) // 列宽
public class Person {
@ExcelProperty(value = {"个人的基本信息","名字"},index = 0)
private String name;
@ExcelProperty(value = {"个人的基本信息","年龄"},index = 1)
private Integer age;
@ExcelProperty(value = {"个人的基本信息","地址"},index = 2)
private String addr;
@ExcelProperty(value = {"个人的基本信息","生日"},index = 3)
@DateTimeFormat("yyyy/MM/dd")//设置导出excel的日期的格式
//注意:使用的是com.alibaba.excel.annotation.format.DateTimeFormat
@ExcelIgnore
private Date birthday;
}
导入excel
/**
* excel数据格式必须与实体类定义一致,否则数据读取不到
*/
@Test
public void testRead(){
List<Person>persons=new ArrayList<>();
//使用easyExcel读取excel表格信息
EasyExcel.read("D:\\easyExcel\\test.xls", Person.class, new AnalysisEventListener<Person>() {
//从表头开始逐行开始解析excel表的每行数据
//会把每行的数据封装到o对象中
@Override
public void invoke(Person o, AnalysisContext analysisContext) {
persons.add(o);//向List集合中添加数据
}
//读取完毕执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("read over");
}
}).sheet("个人信息表").doRead();
}
例子:导出一个指定页码最新交易点股票的相关信息表
1.设置接口
这里使用的是HttpServletResponse来导出excel数据,故方法类型为void
/**
* 导出指定页码最新交易点股票的相关信息
* @param page 指定页码
* @param pageSize 每页的大小
* @param response
*/
@GetMapping("/stock/export")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "当前页数", required = false, defaultValue = "1"),
@ApiImplicitParam(name = "pageSize", value = "每页的记录数", required = false, defaultValue = "20")
})
@ApiOperation("导出指定页码最新交易点股票的相关信息")
public void exportStockPageInfo(
@RequestParam(value = "page",required = false,defaultValue = "1")Integer page,
@RequestParam(value = "pageSize",required = false,defaultValue = "20")Integer pageSize,
HttpServletResponse response){
stockService.exportStockPageInfo(page,pageSize,response);
}
2.业务实现
/**
* 导出指定页码最新交易点股票的相关信息
* @param page 指定页码
* @param pageSize 每页的大小
* @param response
*/
@Override
public void exportStockPageInfo(Integer page, Integer pageSize, HttpServletResponse response) {
//1.获取股票的信息
R<PageResult<StockUpDownDomain>> stockPageInfo = this.getStockPageInfo(page, pageSize);
List<StockUpDownDomain> rows = stockPageInfo.getData().getRows();
//2.导出excel
// 这里使用swagger 会导致各种问题,请直接用浏览器或者用postman
//设置响应的内容类型为excel
response.setContentType("application/vnd.ms-excel");
//设置响应内容的编码格式
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系
try {
String fileName = URLEncoder.encode("股票信息表", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), StockUpDownDomain.class).sheet("股票相关信息").doWrite(rows);
} catch (IOException e) {
log.error("当前页码:{},每页大小:{},当前时间:{},错误信息:{}",page,pageSize,DateTime.now().toString("yyyy-MM-dd HH:mm:ss"),e.getMessage());
//通知前端异常
// 设置响应的内容类型为 JSON
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
R<Object> error = R.error(ResponseCode.ERROR);
try {
//把该数据转换成json数据格式
String jsonData = new ObjectMapper().writeValueAsString(error);
response.getWriter().print(jsonData);
} catch (IOException ex) {
log.error("exportStockPageInfo:响应数据失败,时间:{}",DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
}
}
}