HSSFWorkbook导出Excel

HSSFWorkbook导出Excel

    • POI导出Excel的三种 workbook的区别
    • maven依赖
    • 代码实现

POI导出Excel的三种 workbook的区别

HSSFWorkbook:
针对EXCEL 2003版本,扩展名为.xls,此种的局限就是导出的行数最多为65535行。因为导出行数受限,不足7万行,所以一般不会发送内存溢出(OOM)的情况
XSSFWorkbook:
其对应的是EXCEL2007+ ,扩展名为.xlsx ,这种形式的出现是由于第一种HSSF的局限性产生的,因为其导出行数较少,XSSFWorkbook应运而生,最多可以导出104万行。

不过这样就伴随着一个问题–OOM内存溢出。因为使用XSSFWorkbook创建的book sheet row cell 等是存在内存中的,并没有持久化到磁盘上,那么随着数据量的增大,内存的需求量也就增大。那么很有可能出现 OOM了,那么怎么解决呢?
SXSSFWorkbook:
SXSSFWorkbook可以根据行数将内存中的数据持久化写到文件中。(用内存换导出的数据量)

此种的情况就是设置最大内存条数,比如设置最大内存量为5000行, new SXSSFWookbook(5000),当行数达到 5000 时,把内存持久化写到文件中,以此逐步写入,避免OOM。这样就完美解决了大数据下导出的问题

maven依赖

        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poiartifactId>
            <version>3.17version>
        dependency>
        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poi-ooxmlartifactId>
            <version>3.17version>
        dependency>

代码实现

//Controller层
@GetMapping("/exportData")
    public void exportData(HttpServletResponse res){
        service.exportData(res);
    }
//Service实现层
String[] header = {"编号","姓名"};
@Override
    public void exportData(HttpServletResponse res) {
        List<Goods> goods = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Goods good = new Goods();
            good.setId(String.valueOf(i));
            good.setName("我是第"+i+"号");
            goods.add(good);
        }
        try(HSSFWorkbook workbook = new HSSFWorkbook()){
            //设置导出的文件的名字
            String fileName = "我是一份导出文件.xls";
            //创建sheet页
            HSSFSheet sheet = workbook.createSheet("页1");
            //创建第一行
            HSSFRow row = sheet.createRow(0);
            //表头
            for (int i = 0; i < 2; i++) {
                //创建单元格,第i列
                HSSFCell cell = row.createCell(i);
                if(i == 0){
                    cell.setCellValue(header[i]);
                }else {
                    cell.setCellValue(header[i]);
                }
            }
            int rowNum = 1;
            for (int i = 0; i < goods.size(); i++) {
                HSSFRow row1 = sheet.createRow(rowNum);
                row1.createCell(0).setCellValue(goods.get(i).getId());
                row1.createCell(1).setCellValue(goods.get(i).getName());
                rowNum++;
            }
            res.setContentType("application/octet-stream");
            res.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
            res.flushBuffer();
            workbook.write(res.getOutputStream());
        }catch (Exception e){
            logger.warning("出错了");
        }
    }

你可能感兴趣的:(从菜鸡到花里胡哨的菜鸡,poi,excel)