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實現大批量數據的讀取

代碼實現

自定義實現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。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/226127.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:48
下一篇 2024-12-09 14:48

相關推薦

發表回復

登錄後才能評論