快速掌握EasyExcel在web场景中的应用(读和写)

目录

一、引入依赖

二、设置表头

三、web下载模板

四、测试下载功能

五、复杂表头

六、写入数据

七、格式优化

7.1 日期自定义转换

7.2 列宽行高注解

八、动态表头

 九、动态表格写入数据


一、引入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

二、设置表头

@ExcelProperty注解,作用在实体类属性上,用来对应Excel表头和属性。

@Data
public class SteelVarietyInfoVo {

    @ExcelProperty("品种")
    private String variety;

    @ExcelProperty("应用领域")
    private String domain;

    @ExcelProperty("板坯类型")
    private String plateType;

    @ExcelProperty("牌号(钢种)")
    private String steelGrade;

    @ExcelProperty("创建时间")
    private String createTime;

    @ExcelProperty("修改时间")
    private String updateTime;

}

三、web下载模板

@Api(tags = "excel工具")
@RestController
@RequestMapping("excel")
public class ExcelController {
    @Resource
    private SteelVarietyInfoService steelVarietyInfoService;


    @ApiOperation("下载模板")
    @GetMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletResponse response) throws IOException {
        steelVarietyInfoService.downloadTemplate(response);
    }

}
@Service
public class SteelVarietyInfoServiceImpl extends ServiceImpl<SteelVarietyInfoMapper, SteelVarietyInfo> implements SteelVarietyInfoService {

    @Override
    public void downloadTemplate(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());

        String fileName = URLEncoder.encode("品种钢导入模板", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), SteelVarietyInfoVo.class);
        write.sheet("模板").doWrite(() -> null);
    }
}

四、测试下载功能

 下载功能测试正常。

五、复杂表头

    @ExcelProperty({"时间","创建时间"})
    private String createTime;

    @ExcelProperty({"时间","修改时间"})
    private String updateTime;

通过如上传入String数组,即可生成多级表头。

六、写入数据

我们去数据库查询出所有的数据,然后写入excel对应的表头中。

    @ApiOperation("导出全部数据到Excel")
    @GetMapping("/exportAllDataExcel")
    public void exportAllDataExcel(HttpServletResponse response) throws IOException {
        steelVarietyInfoService.exportAllDataExcel(response);
    }
    @Override
    public void exportAllDataExcel(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());

        String fileName = URLEncoder.encode("品种钢数据", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), SteelVarietyInfoVo.class);
        List<SteelVarietyInfoVo> list = this.findAllData();
        write.sheet("全部数据").doWrite(list);
    }

    private List<SteelVarietyInfoVo> findAllData() {
        List<SteelVarietyInfo> list = baseMapper.selectList(null);
        List<SteelVarietyInfoVo> voList = new ArrayList<>();
        for(SteelVarietyInfo item : list){
            SteelVarietyInfoVo vo = new SteelVarietyInfoVo();
            BeanUtils.copyProperties(item,vo);
            vo.setCreateTime(item.getCreateTime().toString());
            vo.setUpdateTime(item.getUpdateTime().toString());
            voList.add(vo);
        }
        return voList;
    }

七、格式优化

7.1 日期自定义转换

上面的例子中,我们发现,时间显示格式不符合日常习惯。

我们可以借助easyexcel提供的@DateTimeFormat注解来解决这个问题,但是要注意使用该注解就必须用时间类型去接收,String类型是无法完成转换的。时间类型使用Date、LocalDateTime都可以。

另外注意不要使用Spring提供的@DateTimeFormat注解,否则也无效。

    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty({"时间","创建时间"})
    private LocalDateTime createTime;

    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty({"时间","修改时间"})
    private LocalDateTime updateTime;
 

当然了,如果你不想用注解,用String类型来接收的话,那么就需要在代码里面自行处理完成后再返回,也是可以的。

7.2 列宽行高注解

我们还发现单元格有的挤在一块儿,建议表头文字占一行显示,这样更好看一点。

注解描述
@ContentRowHeight(10)设置正文行高,作用在类上
@HeadRowHeight(20)设置表头行高,作用在类上
@ColumnWidth(25)设置列宽度,作用在类上、属性上
@Data
@HeadRowHeight(50)
@ContentRowHeight(30)
@ColumnWidth(20)
public class SteelVarietyInfoVo {

    @ExcelProperty("品种")
    private String variety;

    @ExcelProperty("应用领域")
    private String domain;

    @ExcelProperty("板坯类型")
    private String plateType;

    @ExcelProperty("牌号(钢种)")
    private String steelGrade;

    @ColumnWidth(30)
    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty({"时间","创建时间"})
    private LocalDateTime createTime;

    @ColumnWidth(30)
    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty({"时间","修改时间"})
    private LocalDateTime updateTime;

}

八、动态表头

某些特殊场景下,我们需要动态展示表头,如果像之前这样写死表头就不行了。EasyExcel中也提供了动态表头的使用方法。

使用方式就不再是在对应属性上加上@ExcelProperty注解了。

而是获取到ExcelWriterBuilder对象后,调用head()方法,传递一个表头集合作为参数。

    @ApiOperation("下载动态表头模板")
    @GetMapping("/downloadDynamicHeadTemplate")
    public void downloadDynamicHeadTemplate(HttpServletResponse response) throws  IOException{
        steelVarietyInfoService.downloadDynamicHeadTemplate(response);
    }
    @Override
    public void downloadDynamicHeadTemplate(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());

        String fileName = URLEncoder.encode("动态表头演示模板", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream());
        write.head(head()).sheet("模板").doWrite(()->null);

    }

    /**
     * 动态表头
     */
    private List<List<String>> head() {
        List<List<String>> header = new ArrayList<>();

        List<String> head0 = new ArrayList<>();
        head0.add("序号");
        header.add(head0);

        header.add(Arrays.asList("基本信息","姓名"));

        List<String> head2 = new ArrayList<>();
        head2.add("基本信息");
        head2.add("性别");
        List<String> head3 = new ArrayList<>();
        head3.add("基本信息");
        head3.add("联系方式");
        header.add(head2);
        header.add(head3);

        header.add(Arrays.asList("额外信息","兴趣爱好"));
        header.add(Arrays.asList("额外信息","健康状况"));
        header.add(Arrays.asList("额外信息","家庭住址"));

        ArrayList<String> headEnd = new ArrayList<>();
        headEnd.add("是否统计");
        header.add(headEnd);


        return header;
    }

这里提一嘴,表头的返回值是两层List集合   ☞   List<List<String>> head

可以这样理解:外层List表示列,内层List表示行。

 九、动态表格写入数据

    @ApiOperation("导出数据到动态Excel")
    @GetMapping("/exportDataDynamicExcel")
    public void exportDataDynamicExcel(HttpServletResponse response) throws  IOException{
        steelVarietyInfoService.exportDataDynamicExcel(response);
    }
    @Override
    public void exportDataDynamicExcel(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());

        String fileName = URLEncoder.encode("动态表头演示导出数据", StandardCharsets.UTF_8.name());
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream());
        write.head(head()).sheet("清单").doWrite(dynamicData());
    }

    private List<List<String>> dynamicData() {
        List<List<String>> list = new ArrayList<>();
        list.add(Arrays.asList("1","小黑","男","15312345678","唱跳rap篮球","良好","北京市朝阳区xxx","是"));
        list.add(Arrays.asList("2","小白","男","15312341234","护花","良好","北京市朝阳区xxx","是"));
        return list;
    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

何苏三月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值