博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POI 海量数据/大数据文件生成SXSSFWorkbook使用简介
阅读量:6841 次
发布时间:2019-06-26

本文共 4167 字,大约阅读时间需要 13 分钟。

  在之前我们知道处理xls的excel用的workbook是HSSFWorkbook,处理xlsx的excel用的是XSSFWorkbook。

  上面两个类导出excel的时候数据会驻留在内存中,所以当数据量大的时候容易造成内存溢出。SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel。POI要求3.8以上,生成的文件格式要求是07及以上版本,因为excel07级以上版本的行数1048576,量很大,而03版本的只有6万多。

  读取07及以上版本的excel仍然是“XSSFWorkbook”,写入则为“SXSSFWorkbook ”。

导出的代码:(一个简单的测试,如果想封装工具类,参考:)

package cn.xm.exam.utils;import java.io.File;import java.io.FileOutputStream;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.streaming.SXSSFWorkbook;public class SXSSFExcelUtil {    public static void main(String[] args) {        String[] title = { "id", "name", "sex" };        // 创建一个工作簿        Workbook workbook = new SXSSFWorkbook();        // 创建一个工作表sheet        Sheet sheet = workbook.createSheet();        // 创建第一行        Row row = sheet.createRow(0);        // 创建一个单元格        Cell cell = null;        // 创建表头        for (int i = 0; i < title.length; i++) {            cell = row.createCell(i);            cell.setCellValue(title[i]);        }        // 从第二行开始追加数据        for (int i = 1; i <= 10000; i++) {            // 创建第i行            Row nextRow = sheet.createRow(i);            // 参数代表第几列            Cell cell2 = nextRow.createCell(0);            cell2.setCellValue("a" + i);            cell2 = nextRow.createCell(1);            cell2.setCellValue("user" + i);            cell2 = nextRow.createCell(2);            cell2.setCellValue("男");        }        // 创建一个文件        File file = new File("G:/tt1.xls");        try {            file.createNewFile();            // 打开文件流            FileOutputStream outputStream = new FileOutputStream(file);            workbook.write(outputStream);            outputStream.close();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

 

 

 补充:SXFFSWoorkbook导出的excel相比于XSSFWoorkbook导出的更节省空间:

 下面分别是SXXFS\XFFS\HFFS导出上面1万条数据的excel的文件大小:

 

 补充:测试HSSF\XSSF导出的数据占用内存,而SXFFS导出的数据不容易造成内存溢出

数据改为5万条并且写入之后查看内存信息:

 (1)查看XSSF导出的时候占用JVM内存

package cn.xm.exam.utils;import java.io.File;import java.io.FileOutputStream;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class SXSSFExcelUtil {    public static void main(String[] args) {        String[] title = { "id", "name", "sex" };        // 创建一个工作簿        Workbook workbook = new XSSFWorkbook();        // 创建一个工作表sheet        Sheet sheet = workbook.createSheet();        // 创建第一行        Row row = sheet.createRow(0);        // 创建一个单元格        Cell cell = null;        // 创建表头        for (int i = 0; i < title.length; i++) {            cell = row.createCell(i);            cell.setCellValue(title[i]);        }        // 从第二行开始追加数据        for (int i = 1; i <= 50000; i++) {            // 创建第i行            Row nextRow = sheet.createRow(i);            // 参数代表第几列            Cell cell2 = nextRow.createCell(0);            cell2.setCellValue("a" + i);            cell2 = nextRow.createCell(1);            cell2.setCellValue("user" + i);            cell2 = nextRow.createCell(2);            cell2.setCellValue("男");        }        // 创建一个文件        File file = new File("G:/tt1.xls");        try {            file.createNewFile();            // 打开文件流            FileOutputStream outputStream = new FileOutputStream(file);            workbook.write(outputStream);            outputStream.close();            // dispose of temporary files backing this workbook on disk//            ((SXSSFWorkbook) workbook).dispose();            System.out.println("创建完成");            System.out.println("总的内存->" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "MB");            System.out.println("剩余的内存->" + Runtime.getRuntime().freeMemory() / 1024 / 1024 + "MB");        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

结果:

创建完成

总的内存->883MB
剩余的内存->550MB

 

 (2)查看SXSSF导出的时候占用JVM内存

将上面XSSF改为SXFFS查看结果:

创建完成

总的内存->182MB
剩余的内存->175MB

 

转载地址:http://qzdul.baihongyu.com/

你可能感兴趣的文章
来自Reddit的声音:网络人员对SDN说“不”
查看>>
贵阳“小步快跑”搭上云计算的早班车
查看>>
配置少量固态硬盘即能大幅提升性能
查看>>
国内车载信息安全市场 东软靠技术创新的行动力独树一帜
查看>>
中国银行携手IBM成功建成智能化网点
查看>>
再谈大型数据中心的运维工作
查看>>
报告显示电话监控技术处于发展浪潮
查看>>
安全研究人员发现可以利用推特控制僵尸网络
查看>>
三种在Linux上创建或扩展交换分区的简单方法
查看>>
LMD Tool:Linux恶意软件检测工具
查看>>
铜缆宽带接入即将走向末路?
查看>>
哪些技术对5G贡献最大?毫米波成工程师追捧之一
查看>>
企业级SaaS服务的现实之路:放弃团队 直指公司
查看>>
你应该成为 Web 开发者的 5 大理由
查看>>
Locky勒索软件是如何利用DGA的?
查看>>
打造自己的 Python 编码环境
查看>>
使用Azure托管磁盘简化云存储管理
查看>>
你需要知道知道这几个因素会不利于关键词排名优化
查看>>
《Cocos2D权威指南》——1.5 在设备上运行HelloCocos2D项目
查看>>
东莞市政府常务会议审议通过《东莞市大数据发展实施方案》
查看>>