excel批量导出成压缩包,按某一个字段分成多个excel导出

//表头列名样式
public static XSSFCellStyle createHeadStyle(XSSFWorkbook workbook) {
        XSSFCellStyle style = workbook.createCellStyle();
        // 设置背景色
        style.setFillForegroundColor(new XSSFColor(new Color(87, 163, 250)));
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        // 设置边框
        style.setBorderBottom(BorderStyle.THIN); // 下边框
        style.setBorderRight(BorderStyle.THIN);// 右边框
        style.setBorderLeft(BorderStyle.THIN);// 左边框
        style.setBorderTop(BorderStyle.THIN);// 上边框
        // 设置单元格的中心水平对齐-居中
        style.setAlignment(HorizontalAlignment.CENTER);
        // 设置单元格的垂直对齐类型-居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // 生成字体
        XSSFFont font = workbook.createFont();
        // 设置字体类型
        font.setFontName("微软雅黑");
        // 设置字体大小
        font.setFontHeightInPoints((short) 10);
        // 把字体应用到当前的样式
        style.setFont(font);
        return style;

    }

   	//表格数据单元格样式
    public static XSSFCellStyle createBodyStyle(XSSFWorkbook workbook) {
        XSSFCellStyle style = workbook.createCellStyle();
        // 设置边框
        style.setBorderBottom(BorderStyle.THIN); // 下边框
        style.setBorderRight(BorderStyle.THIN);// 右边框
        style.setBorderLeft(BorderStyle.THIN);// 左边框
        style.setBorderTop(BorderStyle.THIN);// 上边框
        // 设置单元格的中心水平对齐-居中
        style.setAlignment(HorizontalAlignment.CENTER);
        // 设置单元格的垂直对齐类型-居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // 生成字体
        XSSFFont font = workbook.createFont();
        // 字体类型
        font.setFontName("微软雅黑");
        // 设置字体大小
        font.setFontHeightInPoints((short) 9);
        // 把字体应用到当前的样式
        style.setFont(font);
        return style;
    }
@PostMapping(value = "/export")
    public R export(HttpServletResponse response,@RequestBody BondVO bondVO) throws IOException {
		
		//从数据库中读取数据,可以按条件筛选
        List<Bond> bondList = bondService.list(Wrappers.<Bond>lambdaQuery()              			  				
        .like(StringUtils.isNotBlank(bondVO.getStockCode()),Bond::getStockCode,bondVO.getStockCode()));

        // 字节数组输出流,用于返回压缩后的输出流字节数组
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        // ZIP压缩输出流
        ZipOutputStream zip = new ZipOutputStream(byteOut);
        // Servlet输出流
        OutputStream servletOut = response.getOutputStream();

        try {
			//Bond::getInventoryLevel(拆分成多个excel导出的条件)
            bondList.stream().collect(Collectors.groupingBy(Bond::getInventoryLevel)).forEach((k,v)->{
                XSSFWorkbook workbook = null;
                ByteArrayOutputStream bos = null;
                try {
                    // 1.声明一个工作薄
                    workbook = new XSSFWorkbook();

                    // 2.创建新工作表
                    XSSFSheet sheet = workbook.createSheet(k);

                    // 3.设置表格默认列宽度为15个字节
                    sheet.setDefaultColumnWidth(15);

                    // 4.设置标题和主体单元格样式
                    // 4.1生成一个标题样式
                    XSSFCellStyle headerStyle = createHeadStyle(workbook);
                    // 4.2生成一个主体样式
                    XSSFCellStyle bodyStyle = createBodyStyle(workbook);

                    int rowNum = 0;
                    boolean titleFlag = false;
                    for (Bond bond : v){
                        // 声明Excel标题名称
                        String[] excelHeader = {"列名", "列名"};
                        if(!titleFlag){
                            Row row = sheet.createRow(rowNum++);
                            // 创建标题首行列
                            for (int i = 0; i < excelHeader.length; i++) {
                                Cell cell = row.createCell(i); // 列下标
                                cell.setCellValue(excelHeader[i]); // 列值
                                cell.setCellStyle(headerStyle); // 设置单元格样式
                            }
                        }

                        titleFlag = true;

                        Row row = sheet.createRow(rowNum++);
                        for (int i = 0; i < excelHeader.length; i++) {
                            Cell cell = row.createCell(i);
                            cell.setCellStyle(bodyStyle);
                            if (i == 0){
                                if (bond.getStockName() != null){
                                    cell.setCellValue(bond.getStockName());
                                }
                            }else if (i == 1){
                                if (bond.getTradingMarketCode() != null){
                                    cell.setCellValue(bond.getTradingMarketCode());
                                }
                            }
                        }
                    }

                    // 写入ZIP文件条目并指定名称
                    zip.putNextEntry(new ZipEntry("文件夹名称/"+ k +".xlsx"));
                    // 字节数组输出流,用于转存Excel工作薄字节
                    bos = new ByteArrayOutputStream();
                    // Excel工作薄写入字节数组输出流
                    workbook.write(bos);
                    // 字节数组输出流的完整内容写入zip
                    bos.writeTo(zip);

                    // 刷新压缩输出流
                    zip.flush();
                    // 关闭当前的ZIP条目并定位流以写入下一个条目
                    zip.closeEntry();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                IOUtils.closeQuietly(bos);
                IOUtils.closeQuietly(workbook);
            });

            // 注:转换byte[]前必须关闭zip流
            IOUtils.closeQuietly(zip);

            // 转为字节数组
            byte[] data = byteOut.toByteArray();

            String fileName = "压缩包名称";
            String codedFileName = URLEncoder.encode(fileName, "UTF-8");
            response.setCharacterEncoding("utf-8");

            // 清除缓冲区数据
            response.reset();
            // 设置下载方式,文件名称
            response.setHeader("Content-Disposition", "attachment; filename=" + codedFileName + ".zip");
            // 设置文件下载总大小,前端可以通过这个显示下载进度条
            response.addHeader("Content-Length", "" + data.length);
            // 内容的内容类型及编码格式:application/octet-stream[二进制流]
            response.setContentType("application/octet-stream; charset=UTF-8");

            // 把ZIP字节数组写入到Servlet输出流
            IOUtils.write(data, servletOut);
        } catch (Exception e) {
            log.error("导出失败", e);
            return R.failed("导出失败");
        } finally {
            // 关闭流
            IOUtils.closeQuietly(byteOut);
            IOUtils.closeQuietly(servletOut);
        }
        return R.ok(null,"导出成功");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值