poi读取excel数据(poi读取excel数字类型)

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

poi读取excel数据(poi读取excel数字类型)(1)

代码实现

自定义实现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。

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页