POI实现一个excel 生成多个sheet

1. 要点

1.1 outPutStream 最后才能close
1.2 使用同一个 workbook

示例代码如下:

    @ApiOperation("buttonDownload")
    @LogApi("button and download")
    @PostMapping("/button/download")
    public void buttonDownload(@RequestBody ValidateQuery query, HttpServletResponse response) throws IOException {

        String dateStr = DateUtils.format(new Date(), DateUtils.PATTERN_MM_DD_YYYY_HH_MM_SS);
        String fileName = "PSS Validation_" + dateStr;

        // 设置下载文件格式
        response.addHeader( "Content-Type", "application/octet-stream");
        response.addHeader( "Content-Disposition", "attachment; filename=\"" + fileName + "\".xlsx;filename*=utf-8''" + fileName);

        Workbook workbook = new XSSFWorkbook();
        query.setWorkbook(workbook);


        List<String> names = query.getValidationName();

        try (OutputStream out = response.getOutputStream()) {

            for (int i = 0; i < names.size(); i++) {
                String o = names.get(i);

                query.setCurrentName(o);
                query.setIndex(i);

                if (ValidationConstant.DOS_ARR.contains(o)) {
                    dosService.pssValidationDownload(query, response);
                }

                if (ValidationConstant.VALIDATION_ARR.contains(o)) {
                    validationService.pssValidationDownload(query, response);
                }
            }


            query.getWorkbook().write(out);
        }
    }
1.3 每个sheet 设置一个index和name
    /**
     * 一个 excel 文件,同时 生成多个sheet;
     * 解析动态表头,使用此方法
     *
     * @param query     sheet 属性 封装
     * @param response  响应
     * @param excelHead 表头
     * @param excelData 数据
     * @author: leiming5
     */
    public void download(ValidateQuery query, HttpServletResponse response, List<List<String>> excelHead, List<List<Object>> excelData) {

        String sheetName = query.getCurrentName();
        String header = response.getHeader("content-disposition");

        if (StringUtils.isEmpty(header)) {
            String dateStr = DateUtils.format(new Date(), DateUtils.PATTERN_MM_DD_YYYY_HH_MM_SS);
            response.setHeader("content-disposition", "attachment;filename=" + sheetName + "_" + dateStr + ".xlsx");
        }

        try {
            Workbook workbook = query.getWorkbook();
            if (workbook == null) {
                workbook = new XSSFWorkbook();
            }

            // 生成一个表格
            Sheet sheet = workbook.createSheet(sheetName);

            // 生成表格
            createExcel(sheet, excelHead, excelData, workbook, sheetName);

            // 设置多sheet表格名称
            Integer index = query.getIndex();
            if (index != null) {
                workbook.setSheetName(index, sheetName);
            }

            if (StringUtils.isEmpty(header)) {
                OutputStream out = response.getOutputStream();
                workbook.write(out);
                out.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值