java使用HSSFSheet导出.xls文件,解决数据量超65536行报错

 
HSSFSheet,主要用于操作Excel 97-2003版本(扩展名为.xls),支持的最大行数为65536行,最大列数为256列‌。当单个sheet页超过65536行时,会报错,可以选择采取分sheet页处理
在处理大量数据时,可能会占用大量内存,容易导致内存溢出(OOM)错误‌
    /**
     * 导出excel模板
     *
     * @param title    标题
     * @param dataList 数据
     * @param response 响应
     */
    public static void exportExcelLinkedList(LinkedHashMap<String, String> title, List<LinkedHashMap<String, Object>> dataList, HttpServletResponse response) {
        try {
            // 创建一个HSSFWorkbook,对应一个Excel文件
            HSSFWorkbook workbook = new HSSFWorkbook();
            //记录创建的sheet数量
            int sheetIndex=1;
            //Excel一张(或者说一页)默认行数是65535,如果超过,要sheet分页
            if(dataList.size()>65535){
                List<List<LinkedHashMap<String, Object>>> partition = Lists.partition(dataList, 65535);
                for (List<LinkedHashMap<String, Object>> list : partition) {
                    getSheet(title,list,workbook,sheetIndex++);
                }
            }else{
                getSheet(title,dataList,workbook,sheetIndex);
            }
            response.setContentType("application/octet-stream; charset=utf-8");//以流的形式对文件进行下载
            response.setHeader("Content-Disposition", "attachment;");
            workbook.write(response.getOutputStream());
            response.getOutputStream().close();

        } catch (IOException e) {
            log.error("error", e);
        }
    }

保证每个sheet页都有标题列

    public static void getSheet(LinkedHashMap<String, String> title, List<LinkedHashMap<String, Object>> dataList,HSSFWorkbook workbook,int sheetIndex){
        // 在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = workbook.createSheet("sheet"+sheetIndex);
        // 在sheet中添加表头第0行
        HSSFRow row = sheet.createRow(0);
        // 创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        DataFormat dataFormat = workbook.createDataFormat();
        cellStyle.setDataFormat(dataFormat.getFormat("@"));
        // 声明列对象
        HSSFCell headCell;
        // 创建标题
        int rowKey = 0;
        for (Map.Entry entry : title.entrySet()) {
            headCell = row.createCell(rowKey);
            headCell.setCellValue(entry.getValue().toString());
            headCell.setCellStyle(cellStyle);
            rowKey++;
        }

        // 创建内容
        HSSFCell rowCell;
        if (!CollectionUtils.isEmpty(dataList)) {
            for (int i = 0; i < dataList.size(); i++) {
                row = sheet.createRow(i + 1);
                Map<String, Object> data = dataList.get(i);
                int j = 0;
                for (Map.Entry entry : title.entrySet()) {
                    rowCell = row.createCell(j);
                    rowCell.setCellType(CellType.STRING);
                    rowCell.setCellValue(data.get(String.valueOf(entry.getKey()).toUpperCase().replaceAll("-", "_")) == null ? "" : data.get(String.valueOf(entry.getKey()).toUpperCase().replaceAll("-", "_")).toString());
                    rowCell.setCellStyle(cellStyle);
                    j++;
                }
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值