文章插圖

文章插圖
POI實現大數據的導入
之前介紹過通過POI實現數據的導出以及百萬數據的導出,今天介紹一般數據以及大數據集的數據導入 。之前介紹過POI操作Excel2007的三種模式:用戶模式:有許多分裝好的方法操作簡單事件模式:基于SAX方式解析XML,他是一個接口,是一種XML解析的替代方法,不同于DOM解析XML文檔時把所有數據內容一次性加載到內存,他是逐行掃描SXSSF對象:生成海量Excel數據文件
POI基于用戶模式的數據導出
【poi讀取excel數據類型 poi讀取excel數據一行一行數據存儲】主要步驟:根據上傳信息創建Workbok根據Workbook創建Sheet讀取Sheet行中數據
@ApiOperation(value="http://www.mnbkw.com/jxjc/171536/導入數據")@RequestMapping(value="http://www.mnbkw.com/importpoi",method=RequestMethod.POST)@ResponseBodypublicCommonResultimportExcelPOI(@RequestParam(name="file")MultipartFileimportfile)throwsException{//根據上傳信息創建workboolWorkbooksheets=WorkbookFactory.create(importfile.getInputStream());//創建一個sheetSheetsheet=sheets.getSheetAt(0);//從第二行獲取數據List<MesAdmin>mesAdmins=newArrayList<>();//從第二行讀取數據for(intrown=1;rown<sheet.getLastRowNum();rown++){Rowrow=sheet.getRow(rown);MesAdminmesAdmin=newMesAdmin();for(intcelln=0;celln<row.getLastCellNum();celln++){//此處為數據每行數據以及對每行數據進行操作}}returnCommonResult.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文檔讀取數據的機制,逐行掃描文檔,一邊掃描一邊解析,解析原理如圖:
packagecom.macro.mall.tiny.config;importorg.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;importorg.apache.poi.xssf.usermodel.XSSFComment;importjava.util.ArrayList;importjava.util.List;//自定義Sheet給予Sax解析處理器publicclassMesSheetHandlerimplementsXSSFSheetXMLHandler.SheetContentsHandler{//行信息privateList<String>lRows=newArrayList<String>();[email protected](inti){if(i>0){lRows.clear();[email protected][email protected](inti){//可以每行都對數據進行插入操作,也可以使用監聽進行數據操作System.out.println("i:"+lRows.get(0));[email protected][email protected][email protected][email protected](Strings,Strings1,XSSFCommentxssfComment){if(lRows!=null){lRows.add(s1);}else{lRows.add("");}}}在Controller層實現解析@ApiOperation(value="http://www.mnbkw.com/jxjc/171536/批量導入用戶數據")@RequestMapping(value="http://www.mnbkw.com/importpoi",method=RequestMethod.POST)@ResponseBodypublicCommonResultimportExcelpoiSax(@RequestParam(name="file")MultipartFilemultipartFile,HttpServletRequestrequest)throwsException{//Stringfile="C:/Users/180454/Downloads/1.xlsx";//根據Eccel獲取OPCPackage對象OPCPackagepkg=OPCPackage.open(multipartFile.getInputStream());//try{//創建XSSFReaderXSSFReaderxssfReader=newXSSFReader(pkg);//獲取SharedStringTable對象SharedStringsTablesharedStringsTable=xssfReader.getSharedStringsTable();//獲取StylesTable對象StylesTablestyles=xssfReader.getStylesTable();XMLReaderxmlReader=XMLReaderFactory.createXMLReader();MesSheetHandlermesSheetHandler=newMesSheetHandler();xmlReader.setContentHandler(newXSSFSheetXMLHandler(styles,sharedStringsTable,mesSheetHandler,false));XSSFReader.SheetIteratorsheets=(XSSFReader.SheetIterator)xssfReader.getSheetsData();//每一個Sheetwhile(sheets.hasNext()){InputStreamsheetstream=sheets.next();InputSourcesheetSource=newInputSource(sheetstream);try{xmlReader.parse(sheetSource);LOGGER.info("row:"+"結束");}finally{sheetstream.close();}}}finally{pkg.close();}returnCommonResult.success(ResultCode.SUCCESS);}總結:通過簡單地介紹Excel讀取數據的兩種模式,可以發現在用戶模式下Excel讀取實現簡單但是內存占用量大,不理想,而事件模式操作比較繁瑣,但是可以讀取大文件的Excel 。
- 做表格的軟件excel教程視頻算數 做表格的軟件excel教程合并單元格
- 電子表格下載安裝,免費的excel在哪下載?
- excel表格怎么排序 excl表格怎樣排序
- excel設置了密碼怎么把密碼解除掉 Excel解除密碼
- excel怎么進行回歸預測 excel利用回歸預測未來數據
- php excel導入數據庫更新數據 phpexcel導入數據庫亂碼
- excel的最新版本是多少 最新版excel是哪個版本
- java excel框架 java實現excel
- Excel怎么設置密碼保護 excel怎么設置保護密碼怎么設置
- 如何將中國統計年鑒中的數據導出 中國統計年鑒數據怎么導出到excel表格
