当前位置:首页 > 网络技术 > poi读取excel数据(poi读取excel数字类型)(poi读取excel的两种方式)

poi读取excel数据(poi读取excel数字类型)(poi读取excel的两种方式)

longge2022-03-24 01:48:46网络技术60

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<MesAdmin> 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文档读取数据的机制,逐行扫描文档,一边扫描一边解析,解析原理如图:

代码实现

自定义实现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<String> lRows = new ArrayList<String>(); // 处理一行信息
    @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/180454/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。

免责声明
本站部分资源来源于互联网 如有侵权 请联系站长删除
龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。#转载请注明出处!

“poi读取excel数据(poi读取excel数字类型)(poi读取excel的两种方式)” 的相关文章

怎么找优质内容源(千万级别优质内容源推荐)

怎么找优质内容源(千万级别优质内容源推荐)

  做自媒体运营的朋友可能都有这种感觉,每天为如何寻找文章写作素材而烦恼,写完文章又为怎么配图而头疼。如果有好的素材与思路,下笔如有神,写出来的文章质量也比较好。但是如果找不到素材,跳楼的心都有了。 ...

搜索引擎投票算法(大神总结的教程)(投票的方法)

搜索引擎投票算法(大神总结的教程)(投票的方法)

  《搜索引擎原理系列教程》这个虽然称不上书籍,但由于里面信息量以及内容比较实用,也弥补了百度白皮书的一些短板——话语浮于表面,另外值得鼓励的是,这个教程完全是由一个民间的SEO爱好者总结,这份精神值...

零基础玩转刷爆朋友圈的小清新人像(零基础玩转刷爆朋友圈的小清新人像像)

零基础玩转刷爆朋友圈的小清新人像(零基础玩转刷爆朋友圈的小清新人像像)

课程介绍本课程全面讲解了多种构图思路和技巧,运用不同天气拍出不一样的小清新风格,学会以后给女朋友拍照再也不尴尬了,想要脱单学一学拍照。教程包括如何教你拍照,如环境,光度,还讲解使用软件修图,单反相机的...

小白9天快速掌握Java基础

小白9天快速掌握Java基础

课程介绍本课程将会从零基础学员角度出发,带你9天快速掌握Java,课程知识点编排循序渐进,能够将每一个知识点落地到实际案例,拒绝“听得懂、不会练、不会敲”并在课程最后通过《学生管理系统》案例整合基础知...

详谈jpa中表的@OneToMany等关联关系_java(jpa onetomany)

详谈jpa中表的@OneToMany等关联关系_java(jpa onetomany)

目录 一、@OneToOne关系映射 1、通过外键的方式 2、通过关联表的方式来保存一对一的关系 二、@OneToMany 和 @ManyToOne...

Java登录功能实现token生成与验证_java(java token生成和验证)

Java登录功能实现token生成与验证_java(java token生成和验证)

一、token与cookie相比较的优势 1、支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的; 2、无状态化,服务端无需存储token,只需要验证token信...