POI实现大批量数据的读取

POI实现大批量数据的读取POI 实现大数据的导入之前介绍过通过 POI 实现数据的导出以及百万数据的导出 今天介绍一般数据以及大数据集的数据导入

大家好,欢迎来到IT知识分享网。

POI实现大数据的导入

之前介绍过通过POI实现数据的导出以及百万数据的导出,今天介绍一般数据以及大数据集的数据导入。之前介绍过POI操作Excel2007的三种模式:

  • 用户模式:有许多分装好的方法操作简单
  • 事件模式:基于SAX方式解析XML,他是一个接口,是一种XML解析的替代方法,不同于DOM解析XML文档时把所有数据内容一次性加载到内存,他是逐行扫描
  • SXSSF对象:生成海量Excel数据文件
  • POI基于用户模式的数据导出

    主要步骤:

  • 根据上传信息创建Workbok
  • 根据Workbook创建Sheet
  • 读取Sheet行中数据
  • @ApiOperation(value = "导入数据")     @RequestMapping(value = "/importpoi", method = RequestMethod.POST)     @ResponseBody     public CommonResult importExcelPOI(@RequestParam(name="file")MultipartFile importfile) throws  Exception{         //根据上传信息创建workbool         Workbook sheets = WorkbookFactory.create(importfile.getInputStream());         //创建一个sheet         Sheet sheet= sheets.getSheetAt(0);         //从第二行获取数据         List 
      
         mesAdmins =new ArrayList<>();         //从第二行读取数据         for(int rown=1;rown<sheet.getLastRowNum();rown++){             Row row =sheet.getRow(rown);             MesAdmin mesAdmin = new MesAdmin();             for(int celln=0;celln<row.getLastCellNum();celln++){                //此处为数据每行数据以及对每行数据进行操作             }         }         return CommonResult.success(ResultCode.SUCCESS);     } 
      

    使用POI的SAX(事件)模式读取百万数据

    POI在对Excel的XML解析以及做了一些封装,我们只有实现这些封才可以安装SAX方式进行读取Excel,主要就是要实现XSSFSheetXMLHandler.SheetContentsHandler接口,给接口有三个方式需要我们去实现:

    方法作用public void startRow(int i)开始读取行public void endRow(int i)结束读取行public void cell(String s, String s1, XSSFComment xssfComment)读取行中单元

    需求分析

    使用POI的SAX模式解析EXCEl文件

    解决方案

    使用SAX模式,逐行扫描文件,一边扫描一遍解析。不需要将数据存储到内存,对于大型文档解析具有很大优势。

    步骤分析

  • 设置POI的时间模式
  • 1.根据Excel获取文件流

    2.根据文件流创建OPCPackage

    3.创建XSSFReader对象

  • SAX解析
  • 1.自定义Sheet处理器

    2.创建Sax的XmlReader

    3.设置Sheet事件处理器

    4.逐行读取

    原理分析

    Excel2007的本质就是一种特殊的XML存储数据,这样就可以使用基于SXA的方式去解析XML完成对Excel的读取。SAX提供一种从XML文档读取数据的机制,逐行扫描文档,一边扫描一边解析,解析原理如图:

    POI实现大批量数据的读取

    代码实现

    自定义实现XSSFSheetXMLHandler.SheetContentsHandler处理器

    package com.macro.mall.tiny.config; import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler; import org.apache.poi.xssf.usermodel.XSSFComment; import java.util.ArrayList; import java.util.List; //自定义Sheet给予Sax解析处理器 public class MesSheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler {     //行信息     private List        lRows = new ArrayList         (); // 处理一行信息     @Override     public void startRow(int i) {         if(i>0){             lRows.clear();         }     }     /      * 解析行      * @param i      */     @Override     public void endRow(int i) {         //可以每行都对数据进行插入操作,也可以使用监听进行数据操作         System.out.println("i:"+lRows.get(0));     }     /      * 逐单元读取数据      * @param s      * @param s1      * @param xssfComment      */     @Override     public void cell(String s, String s1, XSSFComment xssfComment) {         if(lRows!=null){             lRows.add(s1);         }else{             lRows.add("");         }     } }       

    在Controller层实现解析

        @ApiOperation(value="批量导入用户数据")     @RequestMapping(value = "/importpoi", method = RequestMethod.POST)     @ResponseBody     public CommonResult importExcelpoiSax(@RequestParam(name = "file")MultipartFile multipartFile,HttpServletRequest request) throws   Exception {        // String file= "C:/Users//Downloads/1.xlsx";         //根据Eccel获取OPCPackage对象         OPCPackage pkg = OPCPackage.open(multipartFile.getInputStream());         //         try{             //创建XSSFReader             XSSFReader xssfReader = new XSSFReader(pkg);             //获取SharedStringTable对象             SharedStringsTable sharedStringsTable = xssfReader.getSharedStringsTable();             //获取StylesTable对象             StylesTable styles = xssfReader.getStylesTable();             XMLReader xmlReader = XMLReaderFactory.createXMLReader();             MesSheetHandler mesSheetHandler = new MesSheetHandler();             xmlReader.setContentHandler(new XSSFSheetXMLHandler(styles,sharedStringsTable,mesSheetHandler,false));             XSSFReader.SheetIterator sheets = (XSSFReader.SheetIterator)xssfReader.getSheetsData();             //每一个Sheet             while(sheets.hasNext()){                 InputStream sheetstream = sheets.next();                 InputSource sheetSource = new InputSource(sheetstream);                 try {                     xmlReader.parse(sheetSource);                                        LOGGER.info("row:"+"结束");                 } finally {                     sheetstream.close();                 }             }         }finally {             pkg.close();         }         return CommonResult.success(ResultCode.SUCCESS);     } 

    总结:

    通过简单地介绍Excel读取数据的两种模式,可以发现在用户模式下Excel读取实现简单但是内存占用量大,不理想,而事件模式操作比较繁琐,但是可以读取大文件的Excel。

    Github地址:

    github地址:https://github.com/bangbangzhou/greemes/tree/master

    免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/175830.html

    (0)
    上一篇 2025-04-09 07:45
    下一篇 2025-04-09 08:00

    相关推荐

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    关注微信