easyExcel的使用

目录

 

easyExcel

基本使用easyExcel

1.导入依赖

2.创建pojo类

3.测试

 设置表头名字

合并表头

设置日期的格式

 忽略指定表头的列信息

设置单元格大小 

导入excel

 例子:导出一个指定页码最新交易点股票的相关信息表

1.设置接口

2.业务实现


 

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);
    }

24ca7707e0d24235b89d48321a602370.png

 设置表头名字

在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;
}

083e612b96564953b11ba9833554a117.png

合并表头

@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;
}

c9e1e58df4a34e188cfbf65f35a3c329.png 

设置日期的格式

@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;
}

fe49de355455464cabdc76e0a35ebcaf.png 

 忽略指定表头的列信息

使用@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;
}

085aaf7d57b346fd8965e53a443764c1.png

设置单元格大小 

@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;
}

e61863cfb1b54928bc6a44f077cfa7cf.png

导入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"));
            }
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落落落sss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值