保亭网站建设,抖音代运营,广州市招投标中心官网,三网合一网站建设计划目录 1、百万数据导入1.1 需求分析1.2 思路分析1.3 代码实现1.3.1 步骤分析1.3.2 自定义处理器1.3.3 自定义解析1.3.4 测试 2、百万数据导出2.1、概述2.2、解决方案分析2.3、原理分析2.4、百万数据的导出2.4.1、模拟数据2.4.2、思路分析2.4.3、代码实现2.4.4、测试结果 1、百万… 目录 1、百万数据导入1.1 需求分析1.2 思路分析1.3 代码实现1.3.1 步骤分析1.3.2 自定义处理器1.3.3 自定义解析1.3.4 测试 2、百万数据导出2.1、概述2.2、解决方案分析2.3、原理分析2.4、百万数据的导出2.4.1、模拟数据2.4.2、思路分析2.4.3、代码实现2.4.4、测试结果 1、百万数据导入
1.1 需求分析
使用POI基于事件模式解析案例提供的Excel文件
1.2 思路分析
**用户模式**加载并读取Excel时是通过一次性的将所有数据加载到内存中再去解析每个单元格内容。当Excel数据量较大时由于不同的运行环境可能会造成内存不足甚至OOM异常。
例如读取我们刚刚导出的百万数据
package com.itheima.test;import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;//测试百万数据的导入
public class POIDemo5 {public static void main(String[] args) throws Exception {XSSFWorkbook workbook new XSSFWorkbook(C:\\Users\\syl\\Desktop\\百万用户数据的导出.xlsx);XSSFSheet sheetAt workbook.getSheetAt(0);String stringCellValue sheetAt.getRow(0).getCell(0).getStringCellValue();System.out.println(stringCellValue);}
}
会直接报内存溢出的错误
事件模式 它逐行扫描文档一边扫描一边解析。由于应用程序只是在读取数据时检查数据因此不需要将数据存储在内存中这对于大型文档的解析是个巨大优势。
1.3 代码实现
1.3.1 步骤分析
1设置POI的事件模式 根据Excel获取文件流 根据文件流创建OPCPackage 用来组合读取到的xml 组合出来的数据占用的空间更小 创建XSSFReader对象 2Sax解析 自定义Sheet处理器 创建Sax的XmlReader对象 设置Sheet的事件处理器 逐行读取
1.3.2 自定义处理器
package com.itheima.test;import com.itheima.pojo.User;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.usermodel.XSSFComment;public class SheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler {// 编号 用户名 手机号 入职日期 现住址private User usernull;Overridepublic void startRow(int rowIndex) { //每一行的开始 rowIndex代表的是每一个sheet的行索引if(rowIndex0){user null;}else{user new User();}}Override //处理每一行的所有单元格public void cell(String cellName, String cellValue, XSSFComment comment) {if(user!null){String letter cellName.substring(0, 1); //每个单元名称的首字母 A B Cswitch (letter){case A:{user.setId(Long.parseLong(cellValue));break;}case B:{user.setUserName(cellValue);break;}}}}Overridepublic void endRow(int rowIndex) { //每一行的结束if(rowIndex!0){System.out.println(user);}}
}
1.3.3 自定义解析
package com.itheima.test;import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.apache.poi.xssf.model.StylesTable;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;import java.io.InputStream;/*** 自定义Excel解析器*/
public class ExcelParser {public void parse (String path) throws Exception {//1.根据Excel获取OPCPackage对象OPCPackage pkg OPCPackage.open(path, PackageAccess.READ);try {//2.创建XSSFReader对象XSSFReader reader new XSSFReader(pkg);//3.获取SharedStringsTable对象SharedStringsTable sst reader.getSharedStringsTable();//4.获取StylesTable对象StylesTable styles reader.getStylesTable();XMLReader parser XMLReaderFactory.createXMLReader();// 处理公共属性Sheet名Sheet合并单元格parser.setContentHandler(new XSSFSheetXMLHandler(styles,sst, new SheetHandler(), false));XSSFReader.SheetIterator sheets (XSSFReader.SheetIterator) reader.getSheetsData();while (sheets.hasNext()) {InputStream sheetstream sheets.next();InputSource sheetSource new InputSource(sheetstream);try {parser.parse(sheetSource);} finally {sheetstream.close();}}} finally {pkg.close();}}
}
1.3.4 测试
用户模式下读取测试Excel文件直接内存溢出测试Excel文件映射到内存中还是占用了不少内存事件模式下可以流畅的运行。
使用事件模型解析
public class POIDemo5 {public static void main(String[] args) throws Exception{new ExcelParser().parse(C:\\Users\\syl\\Desktop\\百万用户数据的导出.xlsx);}
}2、百万数据导出
2.1、概述
我们都知道Excel可以分为早期的Excel2003版本使用POI的HSSF对象操作和Excel2007版本使用POI的XSSF操作两者对百万数据的支持如下 Excel 2003在POI中使用HSSF对象时excel 2003最多只允许存储65536条数据一般用来处理较少的数据量。这时对于百万级别数据Excel肯定容纳不了。 Excel 2007当POI升级到XSSF对象时它可以直接支持excel2007以上版本因为它采用ooxml格式。这时excel可以支持1048576条数据单个sheet表就支持近百万条数据。但实际运行时还可能存在问题原因是执行POI报表所产生的行对象单元格对象字体对象他们都不会销毁这就导致OOM的风险。
2.2、解决方案分析
对于百万数据量的Excel导入导出只讨论基于Excel2007的解决方法。在ApachePoi 官方提供了对操作大数据量的导入导出的工具和解决办法操作Excel2007使用XSSF对象可以分为三种模式
java代码解析xml
dom4j:一次性加载xml文件再解析
SAX:逐行加载逐行解析
**用户模式**用户模式有许多封装好的方法操作简单但创建太多的对象非常耗内存之前使用的方法
**事件模式**基于SAX方式解析XMLSAX全称Simple API for XML它是一个接口也是一个软件包。它是一种XML解析的替代方法不同于DOM解析XML文档时把所有内容一次性加载到内存中的方式它逐行扫描文档一边扫描一边解析。
SXSSF对象是用来生成海量excel数据文件主要原理是借助临时存储空间生成excel 2.3、原理分析
在实例化SXSSFWorkBook这个对象时可以指定在内存中所产生的POI导出相关对象的数量默认100一旦内存中的对象的个数达到这个指定值时就将内存中的这些对象的内容写入到磁盘中XML的文件格式就可以将这些对象从内存中销毁以后只要达到这个值就会以类似的处理方式处理直至Excel导出完成。
2.4、百万数据的导出
2.4.1、模拟数据
第一步、创建表
CREATE TABLE tb_user2 (id bigint(20) NOT NULL COMMENT 用户ID,user_name varchar(100) DEFAULT NULL COMMENT 姓名,phone varchar(15) DEFAULT NULL COMMENT 手机号,province varchar(50) DEFAULT NULL COMMENT 省份,city varchar(50) DEFAULT NULL COMMENT 城市,salary int(10) DEFAULT NULL,hire_date datetime DEFAULT NULL COMMENT 入职日期,dept_id bigint(20) DEFAULT NULL COMMENT 部门编号,birthday datetime DEFAULT NULL COMMENT 出生日期,photo varchar(200) DEFAULT NULL COMMENT 照片路径,address varchar(300) DEFAULT NULL COMMENT 现在住址
) ENGINEInnoDB DEFAULT CHARSETutf8;
第二步、创建存储过程
DELIMITER $$ -- 重新定义“;”分号
DROP PROCEDURE IF EXISTS test_insert $$ -- 如果有test_insert这个存储过程就删除
CREATE PROCEDURE test_insert() -- 创建存储过程BEGINDECLARE n int DEFAULT 1; -- 定义变量n1SET AUTOCOMMIT0; -- 取消自动提交while n 5000000 do INSERT INTO tb_user2 VALUES ( n, CONCAT(测试, n), 13800000001, 北京市, 北京市, 11000, 2001-03-01 21:18:29, 1, 1981-03-02 00:00:00, \\static\\user_photos\\1.jpg, 北京市西城区宣武大街1号院);SET nn1;END while;COMMIT;
END $$
第三步、开始执行
CALL test_insert();插入500W数据大概需要200至300秒左右
2.4.2、思路分析
导出时使用的是SXSSFWorkBook这个类一个工作表sheet最多只能放1048576行数据 当我们的业务数据已超过100万了一个sheet就不够用了必须拆分到多个工作表。
导出百万数据时有两个弊端
1、不能使用模板
2、不能使用太多的样式
也就是说导出的数据太多时必须要放弃一些。
2.4.3、代码实现
UserController代码
GetMapping(value /downLoadMillion,name 导出用户百万数据的导出)
public void downLoadMillion(Long id,HttpServletRequest request,HttpServletResponse response) throws Exception{userService.downLoadMillion(request,response);
}UserService代码
public void downLoadMillion(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 创建一个空的工作薄Workbook workbook new SXSSFWorkbook();int page 1;int pageSize200000;int rowIndex 1; //每一个工作页的行数int num 0; //总数据量Row row null;Cell cell null;Sheet sheet null;while (true){ //不停地查询ListUser userList this.findPage(page,pageSize);if(CollectionUtils.isEmpty(userList)){ //如果查询不到就不再查询了break;}if(num%10000000){ //每100W个就重新创建新的sheet和标题rowIndex 1;// 在工作薄中创建一个工作表sheet workbook.createSheet(第((num/1000000)1)个工作表);
// 设置列宽sheet.setColumnWidth(0,8*256);sheet.setColumnWidth(1,12*256);sheet.setColumnWidth(2,15*256);sheet.setColumnWidth(3,15*256);sheet.setColumnWidth(4,30*256);// 处理标题String[] titles new String[]{编号,姓名,手机号,入职日期,现住址};// 创建标题行Row titleRow sheet.createRow(0);for (int i 0; i titles.length; i) {cell titleRow.createCell(i);cell.setCellValue(titles[i]);}}// 处理内容for (User user : userList) {row sheet.createRow(rowIndex);cell row.createCell(0);cell.setCellValue(user.getId());cell row.createCell(1);cell.setCellValue(user.getUserName());cell row.createCell(2);cell.setCellValue(user.getPhone());cell row.createCell(3);cell.setCellValue(simpleDateFormat.format(user.getHireDate()));cell row.createCell(4);cell.setCellValue(user.getAddress());rowIndex;num;}page;// 继续查询下一页}
// 导出的文件名称String filename百万数据.xlsx;
// 设置文件的打开方式和mime类型ServletOutputStream outputStream response.getOutputStream();response.setHeader( Content-Disposition, attachment;filename new String(filename.getBytes(),ISO8859-1));response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);workbook.write(outputStream);}2.4.4、测试结果
导出的这个文档大概需要3-5分钟的时间有105 MB内容如下
文章转载自: http://www.morning.bjndc.com.gov.cn.bjndc.com http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.qnkqk.cn.gov.cn.qnkqk.cn http://www.morning.wfysn.cn.gov.cn.wfysn.cn http://www.morning.sjwiki.com.gov.cn.sjwiki.com http://www.morning.nqxdg.cn.gov.cn.nqxdg.cn http://www.morning.rrxgx.cn.gov.cn.rrxgx.cn http://www.morning.lcbgf.cn.gov.cn.lcbgf.cn http://www.morning.psyrz.cn.gov.cn.psyrz.cn http://www.morning.gcdzp.cn.gov.cn.gcdzp.cn http://www.morning.xhqwm.cn.gov.cn.xhqwm.cn http://www.morning.rfwqt.cn.gov.cn.rfwqt.cn http://www.morning.sfdky.cn.gov.cn.sfdky.cn http://www.morning.plflq.cn.gov.cn.plflq.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.xqjz.cn.gov.cn.xqjz.cn http://www.morning.qtqk.cn.gov.cn.qtqk.cn http://www.morning.tgnr.cn.gov.cn.tgnr.cn http://www.morning.zryf.cn.gov.cn.zryf.cn http://www.morning.hbfqm.cn.gov.cn.hbfqm.cn http://www.morning.cctgww.cn.gov.cn.cctgww.cn http://www.morning.rpms.cn.gov.cn.rpms.cn http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn http://www.morning.sdktr.com.gov.cn.sdktr.com http://www.morning.zrgx.cn.gov.cn.zrgx.cn http://www.morning.rfxg.cn.gov.cn.rfxg.cn http://www.morning.rcmwl.cn.gov.cn.rcmwl.cn http://www.morning.wfttq.cn.gov.cn.wfttq.cn http://www.morning.sdhmn.cn.gov.cn.sdhmn.cn http://www.morning.cflxx.cn.gov.cn.cflxx.cn http://www.morning.ltksw.cn.gov.cn.ltksw.cn http://www.morning.dkzwx.cn.gov.cn.dkzwx.cn http://www.morning.smdkk.cn.gov.cn.smdkk.cn http://www.morning.pjwrl.cn.gov.cn.pjwrl.cn http://www.morning.grwgw.cn.gov.cn.grwgw.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn http://www.morning.aowuu.com.gov.cn.aowuu.com http://www.morning.skksz.cn.gov.cn.skksz.cn http://www.morning.tqdqc.cn.gov.cn.tqdqc.cn http://www.morning.wnjrf.cn.gov.cn.wnjrf.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.qsyyp.cn.gov.cn.qsyyp.cn http://www.morning.fpzz1.cn.gov.cn.fpzz1.cn http://www.morning.mdlqf.cn.gov.cn.mdlqf.cn http://www.morning.dqxph.cn.gov.cn.dqxph.cn http://www.morning.hsdhr.cn.gov.cn.hsdhr.cn http://www.morning.jqpyq.cn.gov.cn.jqpyq.cn http://www.morning.xmttd.cn.gov.cn.xmttd.cn http://www.morning.bntgy.cn.gov.cn.bntgy.cn http://www.morning.hmhdn.cn.gov.cn.hmhdn.cn http://www.morning.rmltt.cn.gov.cn.rmltt.cn http://www.morning.dpfr.cn.gov.cn.dpfr.cn http://www.morning.thrgp.cn.gov.cn.thrgp.cn http://www.morning.xxwfq.cn.gov.cn.xxwfq.cn http://www.morning.rkjz.cn.gov.cn.rkjz.cn http://www.morning.deupp.com.gov.cn.deupp.com http://www.morning.rwpfb.cn.gov.cn.rwpfb.cn http://www.morning.jmllh.cn.gov.cn.jmllh.cn http://www.morning.trqzk.cn.gov.cn.trqzk.cn http://www.morning.ggnkt.cn.gov.cn.ggnkt.cn http://www.morning.clqpj.cn.gov.cn.clqpj.cn http://www.morning.nlnmy.cn.gov.cn.nlnmy.cn http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn http://www.morning.fbpdp.cn.gov.cn.fbpdp.cn http://www.morning.qhln.cn.gov.cn.qhln.cn http://www.morning.rsmtx.cn.gov.cn.rsmtx.cn http://www.morning.nggry.cn.gov.cn.nggry.cn http://www.morning.rdfq.cn.gov.cn.rdfq.cn http://www.morning.litao4.cn.gov.cn.litao4.cn http://www.morning.bftr.cn.gov.cn.bftr.cn http://www.morning.tjcgl.cn.gov.cn.tjcgl.cn http://www.morning.phzrq.cn.gov.cn.phzrq.cn http://www.morning.rmrcc.cn.gov.cn.rmrcc.cn http://www.morning.sskns.cn.gov.cn.sskns.cn http://www.morning.jfmyt.cn.gov.cn.jfmyt.cn http://www.morning.kdldx.cn.gov.cn.kdldx.cn http://www.morning.skrcn.cn.gov.cn.skrcn.cn http://www.morning.dnmzl.cn.gov.cn.dnmzl.cn http://www.morning.lfpdc.cn.gov.cn.lfpdc.cn