easyExcel 模板导出(根据返回的集合)

有一次在工作中收到导出表格的需求,但是数据库里面没有这张表。要根据方法返回的集合导出表格。其实有没有表都可以用,稍微变通一下就好了,相信你是懂的。

首先需要一张导出的excel的模板。如下

 接着创建实体类

注意 {. }里的内容要和实体类字段名称保持一致模板右上角不带的{ } 为代码中自定义的数据后面会详细说到

导入依赖

   <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.0-beta1</version>
        </dependency>

在resources下面创建包excel-template 然后把你事先设计好的表格复制到这个包下面

 创建Controller下面的代码可以直接复制使用 但有些地方需要修改注意看注释!!!

@RestController
@Api(tags = "[管理端]表格导出相关API")
@RequestMapping("/api.manage/v1/excel_out")
@Slf4j
@AllArgsConstructor
public class ExportController {

    private StatisticsService statisticsService;

    @ApiOperation(value = "导出电站营收统计表", produces = "application/octet-stream")
    @PostMapping("/station_revenue_out")
    public void stationRevenueOut(@RequestBody SearchModel<RevenueSearch> searchModel, HttpServletRequest httpServletRequest, HttpServletResponse response){
        try {
            RevenueSearch searchParam = searchModel.getSearchParam();
            InputStream templateInputStream = getClass()
                    .getClassLoader().getResourceAsStream("excel-template/revenue_search_out.xlsx");//这个地方写的是你的表格放的路径根据自己的修改!!!
            // 设置输出目标和模板
            String thisDate = DateUtil.format(new Date(),"yyyyMMdd");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("电站营收统计表_"+ thisDate , "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //通过输出流进行文件下载
            ServletOutputStream out = response.getOutputStream();
            ExcelWriter excelWriter = EasyExcel.write(out).withTemplate(templateInputStream).build();
            // 创建 Sheet  开始填充数据
            WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
            // 注意:forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,
            //然后下面的数据往后移动。默认 是false,会直接使用下一行,
            //如果没有则创建。这会把所有数据放到内存,数据量大时会很耗内存
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            // 填充 list变量  {.字段名}

            List<ExportRevenueExcel> exportRevenueExcels = statisticsService.stationRevenueList(searchModel.getSearchParam());
//此处的方法返回的集合就是我要导出的表格中的数据的集合(exportRevenueExcels)!!!
            log.info(exportRevenueExcels.toString());
            excelWriter.fill(exportRevenueExcels, fillConfig, writeSheet);
            String startMonth = DateUtil.format(searchParam.getStartMonth(), "yyyy-MM");
            String endMonth = DateUtil.format(searchParam.getEndMonth(), "yyyy-MM");
            Map<String, Object> map = new HashMap<>(3);
            if (StrUtil.isNotEmpty(startMonth)){
                map.put("startMonth", startMonth);
            }else {
                map.put("startMonth", "");
            }
            if (StrUtil.isNotEmpty(endMonth)){
                map.put("endMonth", endMonth);
            }else {
                map.put("endMonth", "");
            }
//这个map就是用来设计表格右上角{}里面的数据 我的是放的起止时间
            excelWriter.fill(map, writeSheet);
            excelWriter.finish();
            out.flush();
            out.close();
        } catch (Exception e) {
            log.error("export excel error", e);
        }
    }

}

不带 . 的{}就是根据map的key存值 key就是{}里面你自己写的字段

 入行不久 欢迎指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值