增加生成大量数据excel方法

因为时间原因在整理的时候失忆了,所有有些东西忘记了,但是关键点有两个
1.使用SXSSFWorkbook对象声明对象
2. 这段代码很有用

fout = new FileOutputStream(path);
            //内存中只留1000行数据,多余的暂存在硬盘中
            swb = new SXSSFWorkbook(1000);
            //压缩临时文件,很重要,否则磁盘很快就会被写满
            swb.setCompressTempFiles(true);
 /**
     * 系统生成EXCEL(生成大量数据)
     *
     * @param columheader  列集合
     * @param sheetName    sheet名称
     * @param templatePath 生成地址
     * @param fileName     文件名称
     * @return
     */
    public static String createExcel2007BigData(List<List<String>> columheader, int headerRowNum,
                                         String sheetName, String templatePath, String fileName) {
        String path = templatePath;
        //声明输出流
        FileOutputStream fout = null;
        //声明文件对象
        File file = null;
        //声明Excel文档对象
        SXSSFWorkbook swb = null;
        try {
            createDir(path);
            path += fileName + ".xlsx";
            file = new File(path);
            if (!file.exists()) {
                file.createNewFile();
            }
            //初始化输出流
            fout = new FileOutputStream(path);
            //内存中只留1000行数据,多余的暂存在硬盘中
            swb = new SXSSFWorkbook(1000);
            //压缩临时文件,很重要,否则磁盘很快就会被写满
            swb.setCompressTempFiles(true);
            // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet

            //数据超过100万行,分sheet,每个sheet放100万行数据
            int sheetNum = (int) Math.ceil(columheader.size() / 1000000.0);
            for (int sheetIndex = 0; sheetIndex < sheetNum; sheetIndex++) {
                // 取出表头数据
                List<List<String>> partOfColumheader = columheader.subList(0, headerRowNum);

                // 索引长度的第几百万条数据+表头行数
                int subToNum = (sheetIndex + 1) * 1000000 + headerRowNum;
                // 如果subToNum 大于等于总数据的长度,那么就是最后一个sheet页的数据
                if (subToNum >= columheader.size()) {
                    subToNum = columheader.size();
                }
                //截取第i个sheet页所需要的数据
                partOfColumheader.addAll(columheader.subList(sheetIndex * 1000000 + headerRowNum, subToNum));

                // 创建sheet页
                SXSSFSheet sheet = swb.createSheet("Sheet" + sheetIndex);
                // 单元格的显示样式
                CellStyle style = swb.createCellStyle();
                DataFormat format = swb.createDataFormat();
                //设置默认列宽
                for (int j = 0; j < columheader.get(0).size(); j++) {
                    sheet.setColumnWidth(j, 4000);
                }
                int rowNum = 0;
                for (; rowNum < partOfColumheader.size(); rowNum++) {
                    // 第三步,在sheet中添加表头第N行,注意老版本poi对Excel的行数列数有限制short
                    Row row = sheet.createRow(rowNum);
                    Cell cell = null;
                    for (int i = 0; i < columheader.get(rowNum).size(); i++) {
                        cell = row.createCell(i);
                        cell.setCellValue(columheader.get(rowNum).get(i));
                        String s = columheader.get(rowNum).get(i);
                        if (StringUtil.isNotEmpty(s)) {
                            boolean result = s.matches("[0-9.]+");
                            if (!result) {
                                style.setDataFormat(format.getFormat("@"));
                                cell.setCellStyle(style);
                                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                            }
                        }
                    }
                }
            }
            swb.write(fout);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 删除临时文件,很重要,否则磁盘可能会被写满
            if (swb != null) {
                swb.dispose();
            }
            try {
                if (null != fout) {
                    fout.close();
                }
            } catch (IOException e) {

            }
            try {
                if (null != swb) {
                    swb.close();
                }
            } catch (IOException e) {

            }
        }
        return path;
    }

2.额外的小知识:

使用这三行代码可以生成非绿色的数据,可以进行正常的excel数学计算。

 // 存放列值
                        cell.setCellValue(Integer.valueOf(value));
                        style.setDataFormat(format.getFormat("0"));
                        cell.setCellStyle(style);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值