当前位置: 首页 > news >正文

德宏做网站百度账号查询

德宏做网站,百度账号查询,农产品网站建设方案,无锡网站制作工作室1、概述 ​ 我们都知道Excel可以分为早期的Excel2003版本(使用POI的HSSF对象操作)和Excel2007版本(使用POI的XSSF操作),两者对百万数据的支持如下: ​ Excel 2003:在POI中使用HSSF对象时&#…

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、解决方案分析

​ 对于百万数据量的Excel导入导出,只讨论基于Excel2007的解决方法。在ApachePoi 官方提供了对操作大数据量的导入导出的工具和解决办法,操作Excel2007使用XSSF对象,可以分为三种模式:

java代码解析xml

dom4j:一次性加载xml文件再解析

SAX:逐行加载,逐行解析

用户模式: 用户模式有许多封装好的方法操作简单,但创建太多的对象,非常耗内存(之前使用的方法)

事件模式: 基于SAX方式解析XML,SAX全称Simple API for XML,它是一个接口,也是一个软件包。它是一种XML解析的替代方法,不同于DOM解析XML文档时把所有内容一次性加载到内存中的方式,它逐行扫描文档,一边扫描,一边解析。

SXSSF对象:是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel
在这里插入图片描述

3、原理分析

在实例化SXSSFWorkBook这个对象时,可以指定在内存中所产生的POI导出相关对象的数量(默认100),一旦内存中的对象的个数达到这个指定值时,就将内存中的这些对象的内容写入到磁盘中(XML的文件格式),就可以将这些对象从内存中销毁,以后只要达到这个值,就会以类似的处理方式处理,直至Excel导出完成。

4、百万数据的导出

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 '现在住址' 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、创建存储过程

DELIMITER $$    -- 重新定义“;”分号
DROP PROCEDURE IF EXISTS test_insert $$   -- 如果有test_insert这个存储过程就删除
CREATE PROCEDURE test_insert()			  -- 创建存储过程BEGINDECLARE n int DEFAULT 1;				    -- 定义变量n=1SET AUTOCOMMIT=0;						    -- 取消自动提交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 n=n+1;END while;COMMIT;
END $$

3、开始执行

CALL test_insert();

插入500W数据大概需要200至300秒左右

4.2、思路分析

导出时使用的是SXSSFWorkBook这个类,一个工作表sheet最多只能放1048576行数据, 当我们的业务数据已超过100万了,一个sheet就不够用了,必须拆分到多个工作表。

导出百万数据时有两个弊端:

1、不能使用模板

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 pageSize=200000;int rowIndex = 1; //每一个工作页的行数int num = 0; //总数据量Row row = null;Cell cell = null;Sheet sheet = null;while (true){  //不停地查询List<User> userList = this.findPage(page,pageSize);if(CollectionUtils.isEmpty(userList)){  //如果查询不到就不再查询了break;}if(num%1000000==0){  //每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);}

4.4、测试结果

导出的这个文档大概需要3-5分钟的时间,有105 MB,内容如下
在这里插入图片描述

注意:使用附件的形式下载,前端访问必须通过window.open(),否则附件可能无法下载。

http://www.hrbkazy.com/news/5703.html

相关文章:

  • 河南住房和城乡建设厅门户网站西安seo网站排名
  • 青岛做网站哪个公司好怎样建立自己的网站平台
  • 公司做网站的开支会计分录怎么做seo是哪个英文的缩写
  • 建筑素材网站海外短视频软件
  • 图片1600px做网站东莞有限公司seo
  • 外贸公司网站怎么做湖南企业竞价优化
  • 供应链管理系统实验报告济南网络优化网站
  • 优惠网站如何做营销推广软文
  • 网站各页面网店培训教程
  • 建设网站用哪种语言千锋教育的口碑怎么样
  • 网站中的打赏怎么做的1688自然排名怎么做好
  • 小白怎么学做网站360免费建站系统
  • 汽车配件网上商城在线工具seo
  • 建搜索型网站网络推广外包公司哪家好
  • 自己怎么做公司网站seo优质友链购买
  • 仿业务网站源码独立站seo外链平台
  • 企业如何做网站谷歌商店下载官方正版
  • 哪里有好的网站seo诊断方法步骤
  • 什么网站做的好看网站优化公司开始上班了
  • 青岛做网站多少钱快速学电脑培训班
  • 广东网站制作设计软件开发外包公司
  • 西安网站建设地址安卓优化大师手机版
  • 自己给自己网站做推广网络推广软件免费
  • 西安做网站 好运网络网址收录查询
  • 网页升级未成年人自觉离开广州seo服务公司
  • 哪个网站可以做今日头条排版重庆seo网页优化
  • 登录到wordpress后台宁波seo公司排名
  • 做网站每页面费用厦门seo排名优化方式
  • 泉州网站设计哪家公司好写软文是什么意思
  • 电子商务网站建设邢台市seo服务