POI

  • POI:POI是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2 复合文档格式(OLE2)的Java API”

  • 加载并读取Excel时,,由于不同的运行环境可能会造成内存不足甚至OOM异常。

  • poi读取Excel有两种模式,一种是用户模式,一种是sax事件驱动模式。用户模式是通过一次性的将所有数据加载到内存中再去解析每个单元格内容。当Excel数据量比较大时当数据量过大时会出现内存溢出的问题。事件模式:它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取时检查数据,因此不需要将数据存储在内存中。

  • 读取大数据量文件方法:

    • 使用StreamingReader

      1、引入jar包
      <dependency><groupId>com.monitorjbl</groupId><artifactId>xlsx-streamer</artifactId><version>1.2.1</version>
      </dependency>
      2、
      FileInputStream fileInputStream = new FileInputStream(String path);Workbook wb = StreamingReader.builder().rowCacheSize(100)//读取到内存中的行数,默认10.bufferSize(4096)//读取资源,缓存到内存的字节大小。默认1024.open(fileInputStream);//打开资源。只能是xlsx文件Sheet rows = wb.getSheetAt(0);for (Row row : rows) {for (Cell cell : row) {System.out.println(cell.getStringCellValue());}}
      
    • 使用SAX事件驱动

      //根据Excel报表获取OPCPackage
      OPCPackage pkg = OPCPackage.open(fileName);
      //创建XSSFReader对象
      XSSFReader r = new XSSFReader(pkg);
      //获取SharedStringTable对象
      SharedStringsTable sst = r.getSharedStringsTable();
      //创建SAX的XMLReader对象
      XMLReader xmlReader = XMLReaderFactory.createXMLReader();
      // 事件驱动处理器 SheetHandler extends DefaultHandler
      ContentHandler handler = new SheetHandler(sst);
      // 或者使用 XSSFSheetXMLHandler handler = new XSSFSheetXMLHandler(styles, readOnlySharedStringsTable, new ReadExcel(), formatter, false);
      xmlReader.setContentHandler(handler);
      //逐行进行数据读取
      XSSFReader.SheetIterator sheetIterator = (XSSFReader.SheetIterator) r.getSheetsData();while (sheetIterator.hasNext()) {InputStream in = sheetIterator.next();InputSource is = new InputSource(in);parser.parse(is);}
      private static class SheetHandler extends DefaultHandler{//接收元素开始的通知public void startElement(String uri, String localName, String name, Attributes attributes ) throws SAXException {// ......}//根据startElement()的单元格数字类型和characters()的索引值或内容值,最终得出单元格的内容值。接收元素结束的通知public void endElement(String uri, String localName, String name) throws SAXException {//......}//用于获取该单元格对应的索引值或是内容值(如果单元格类型是字符串、INLINESTR、数字、日期则获取的是索引值;其他如布尔值、错误、公式则获取的是内容值)public void characters(char[] ch, int start, int length) {//......}
      }或者://实现SheetContentsHandler接口,覆盖startRow(),endRow(),cell()方法
      private class ReadExcel implements SheetContentsHandler {//读取某行开始@Overridepublic void startRow(int rownum) {//.......}//读取某行结束@Overridepublic void endRow(int rowNum) {//......}//读取某行中的单元格@Overridepublic void cell(String cellReference, String formattedValue, XSSFComment xssfComment) {//......
      }
      
  • 导出大量数据到excel使用SXSSFWorkbook(只可以写数据,不可以读数据 )

    public class WriteExcel {public static void writeLargeXLSXFile() throws IOException {String excelFileName = "D:/FileName.xlsx";String sheetName = "Sheet1";SXSSFWorkbook wb = new SXSSFWorkbook(10000);Sheet sh = wb.createSheet(sheetName);for (int r = 0; r < sh.getLastRowNum(); r++) {//。。。。。。}FileOutputStream out = new FileOutputStream(excelFileName);wb.write(out);out.flush();out.close();wb.dispose();wb.close();}
    }
    

poi读取百万级数据相关推荐

  1. 使用POI导出百万级数据到excel的解决方案

    使用POI导出百万级数据到excel的解决方案 参考文章: (1)使用POI导出百万级数据到excel的解决方案 (2)https://www.cnblogs.com/hxun/p/11419006. ...

  2. Java代码实现百万级数据XLS文件和XLSX文件的读取(已经过测试, 安心使用)

    前言 工作中通常会有XLS和XLSX文件转换成CSV文件的需求,虽然Excel和WPS可以将这两种格式文件很方便的转换,但是不可能将生产上的数据下载下来转换后再上传上去(这真是个疯狂的想法...).目 ...

  3. php导出1万条数据excel_PHP快速导出百万级数据到CSV或者EXCEL文件

    前言: 很多时候,因为数据统计,我们需要将数据库的数据导出到Excel等文件中,以供数据人员进行查看,如果数据集不大,其实很容易:但是如果对于大数集的导出,将要考虑各种性能的问题,这里以导出数据库一百 ...

  4. MYSQL百万级数据,如何优化

    MYSQL百万级数据,如何优化 首先,数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度.但是,有些情况索引是不会起效 ...

  5. Java写入大字符串到oracle数据库_java程序如何提高oracle百万级数据的insert效率

    业务:需要从一个数据库查询百万级数据,在java程序中插入到另一个oracle数据库中 代码: private final int persize = 1000; /** * 推送数据-流程 * @p ...

  6. oracle百万级数据导入,用Perl从oracle导出百万级数据到excel

    Perl从oracle导出百万级数据到excel excel 2007 可以存放1048576行.16384列的数据:excel 2003大概是65535行 我从oracle中导出30万行60列的数据 ...

  7. 百万级数据量,千万级数据量是多少,海量数据的优化方案

    百万级数据量,千万级数据量是多少? 这里的百万级,千万级,针对数据库,指的是表的数据条数.有时也指并发事务量. 海量数据的优化方案 Note:    具体优化要结合自身的业务特性 百万级: 这个数据量 ...

  8. Java利用Apace POI读取Excel中数据

    Java利用Apace POI读取Excel中数据,解析数据 @Testpublic void readExcel() throws IOException{FileSystemView fsv = ...

  9. mysql 优化实例(百万级数据)

    2019独角兽企业重金招聘Python工程师标准>>> MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发. ...

最新文章

  1. 《Spring设计思想》AOP设计思想与原理(图文并茂)
  2. access集团和abm_ACCESS集团宣布启动“ABM单创66会员狂欢节”
  3. [转]算术编码+统计模型=数据压缩 - 第二部分:统计模型
  4. 很全的路由器默认初始密码集合.txt_UpSet——集合关系可视化神器
  5. pomelo获取客户端IP
  6. linux i386,i486,i586,i686和AMD_64,X86,x86_64后缀的区别
  7. 车牌正则oracle,中国车牌号正则表达式
  8. 移动端html富文本编辑器,PC/移动端的富文本编辑器wangEditor的使用
  9. MacW资讯:苹果电脑删除磁盘分区及双系统分区的办法
  10. 兼职平台java设计_基于jsp的高校兼职平台-JavaEE实现高校兼职平台 - java项目源码...
  11. Java实战项目之 [含文档+PPT+源码等]精品基于ssm的足球联赛管理系统的设计与实现
  12. WormHole是一个简单、易用的api管理平台,支持dubbo服务调用
  13. Image Denoising State-of-the-art
  14. 1-Java面试题-基础篇
  15. Unity编辑器扩展——通用组件替换工具
  16. edge保存网页html,微软Edge浏览器不支持网页保存功能怎么办?
  17. Vue的Excel文件下载
  18. 一些常用的语音特征提取算法
  19. FLAT:Flat-LAttice Transformer
  20. 运营必备 - 一针见血,为你讲解版权和商标的不同

热门文章

  1. XDOC云服务API(六)
  2. opencv3.4.0安装contrib3.0.0模块
  3. 8051单片机的串行通信
  4. www.runoob.com
  5. 解决Ubuntu20.04网络图标消失
  6. AtCoder ABC 249
  7. 分析MOS管驱动电路的秘密,看到这里你就啥都懂了
  8. 2、禅道数据看板(django+vue)
  9. 【samba】Ubuntu samba的安装及使用方法
  10. Quartz.Net+Microsoft.Extensions.Hosting创建服务