poi大量数据导入excel表格中

一:简介
SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel, SXSSFWorkbook专门处理大数据,对于大型excel的创建且不会内存溢出的,就只有SXSSFWorkbook了。

它的原理很简单,用硬盘空间换内存(就像hashmap用空间换时间一样)。 SXSSFWorkbook是streaming版本的XSSFWorkbook,它只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到

硬盘里(Windows电脑的话,是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的rows是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。

注:HSSFWorkbook和XSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,(>=2007版)是1048576行,16384列,如果数据量超过了此上限,那么可以使用SXSSFWorkbook来导出。实际上上万条数据,

甚至上千条数据就可以考虑使用SXSSFWorkbook了。

poi 工具类

package net.mochen.common.util;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.*;

import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;


public class ExcelUtil {
   /**
     * 导出大量数据用此方法
     *
     * @param result
     * @param inputStream
     * @param rownum 开始的行数
     * @return
     * @throws IOException
     */
    public static SXSSFWorkbook writeXlsBySXSSFWorkbook(List<List<Object>> result, InputStream inputStream, int rownum) throws IOException {
        SXSSFWorkbook wb;
        Sheet sheet;
        if (inputStream != null) {
            wb = new SXSSFWorkbook(new XSSFWorkbook(inputStream), 100); //表示内存中只保存100
            sheet = wb.getSheetAt(0);
            ;
        } else {
            wb = new SXSSFWorkbook();
            sheet = wb.createSheet("sheet1");
        }
        CellStyle style = wb.createCellStyle();
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
        for (int i = 0; i < result.size(); i++) {
            Row row = sheet.createRow(i + rownum);
            if (result.get(i) != null) {
                for (int j = 0; j < result.get(i).size(); j++) {
                    Cell cell = row.createCell(j);
                    Object o = result.get(i).get(j);
                    cell.setCellValue(o == null ? "" : o.toString());
                    cell.setCellStyle(style);
                }
            }
        }
        return wb;
    }
}

使用案例

    public void exportXls(HttpServletResponse response, List<List<Object>> data) throws Exception {
            String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
//            读取resources目录下的模板文件
            InputStream inputStream = this.getClass().getResourceAsStream("/public/static/supervision/统计表模板.xlsx");
            SXSSFWorkbook wb = ExcelUtil.writeXlsBySXSSFWorkbook(data, inputStream, 4);
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("统计表" + date + ".xlsx", "UTF-8"));
            OutputStream out = response.getOutputStream();
            wb.write(out);
            out.flush();
            out.close();
            wb.dispose();
        
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值