easyExcel引入到boot项目中

一、导出

1、引入依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.2</version>
</dependency>
2、controller层代码
@GetMapping("/export/back")
public Result batchExport(@ModelAttribute CaseDeclareModel caseDeclare,
                          HttpServletResponse response){
       List<CaseDeclareModel> caseDeclares = caseDeclareBiz.selectByModel(caseDeclare);
        if (isEmpty(caseDeclares)) {
            return Result.builder().data(Collections.emptyList()).build();
        }
				//caseDeclares为查询出的数据
				//response为返回对象
        try {
            caseDeclareBiz.exportCaseDeclares(caseDeclares, response);
        }catch (Exception e){
            return Result.builder().error(TextConst.OPERATE_FAIL_ERROR).build();
        }
        return Result.builder().ok(TextConst.OPERATE_SUCCESS).build();                   
}
3、biz层代码
List<CaseDeclareExcelTemplateDTO> dtos = new ArrayList<>();
//。。。省略数据清理
createCaseDeclareExcel(dtos, response);
4、createCaseDeclareExcel方法
private void createCaseDeclareExcel(List<CaseDeclareExcelTemplateDTO> dtos, HttpServletResponse response) throws IOException {
    try {
    		//定义文件名
        String fileName = "案例申报信息-" + LocalDateTimeUtils.formatNow(LocalDateTimeUtils.DEFAULT_DATETIME_FORMAT);
        //设置返回的数据类型
        response.setContentType("application/vnd.ms-excel");
        //设置返回的数据编码格式
        response.setCharacterEncoding("utf-8");
        //设置返回头
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");

        // 表头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        //水平居中
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);

        // 单元格内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        //水平居左
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        //垂直居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        // 这个策略是 头、是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);

        EasyExcel.write(response.getOutputStream())
        				//设置自定义样式
                .registerWriteHandler(horizontalCellStyleStrategy)
                //设置动态表头
                .head(head(dtos))
                //流禁止自动关闭
                .autoCloseStream(Boolean.FALSE)
                //设置sheet名称
                .sheet("案例申报信息")
                //设置导出的数据
                .doWrite(data(dtos));

    } catch (Exception e) {
        //如果导出异常,则返回特定的消息
        // 重置response
        response.reset();
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        Map<String, String> map = new HashMap<String, String>();
        map.put("status", HttpResponseConst.SC_BAD_REQUEST);
        map.put("message", TextConst.FILE_DOWNLOAD_FAIL_ERROR.concat("\t").concat(e.getMessage()));
        response.getWriter().println(toJSONString(map));
    }
}
5、head方法-动态表头方法
private List<List<String>> head(List<CaseDeclareExcelTemplateDTO> dtos) {
	List<List<String>> resultList = new ArrayList<>();
	resultList.add(Arrays.asList("提交人"));
	List<Integer> counts = new ArrayList<>();
        dtos.stream().forEach(dto -> {
            List<BadManDto> badManDtos = dto.getBadManDtos();
            if (CollectionUtils.isNotEmpty(badManDtos)) {
                counts.add(badManDtos.size());
            }
        });
        if (CollectionUtils.isNotEmpty(counts)) {
            max = Collections.max(counts);
        }
        if (max > 0) {
            for (int i = 0; i < max; i++) {
                resultList.add(Arrays.asList("人员" + (i + 1)));
                resultList.add(Arrays.asList("身份证号"));
                resultList.add(Arrays.asList("抓获时间"));
            }
        }
        return resultList;
}
将接收到的数据集合封装出动态表头。
常规的数据先包装,动态表头最后附加。
6、data方法-动态数据方法
private List<List<String>> data(List<CaseDeclareExcelTemplateDTO> dtos) {
    List<List<String>> resultList = new ArrayList<>();
    for (CaseDeclareExcelTemplateDTO dto : dtos) {
        List<String> dataList = new ArrayList<>();
        dataList.add(testStr(dto.getState()));

        List<BadManDto> badManDtos = dto.getBadManDtos();
        if (CollectionUtils.isNotEmpty(badManDtos)) {
            badManDtos.stream().forEach(it -> {
                dataList.add(testStr(it.getName()));
            });
        }
        resultList.add(dataList);
    }
    return resultList;
}
将数据包装为集合。
先包装常规数据,最后附加动态数据。
7、模板文件对象
@Data
@ColumnWidth(40)
public class CaseDeclareExcelTemplateDTO extends BaseRowModel {
		@ExcelProperty(value = "反馈状态", index = 0)
    private String state;
}
如果导入导出的数据是常规的,则可以直接利用模板文件对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值