怎么验证exp导出的表正确(Export大数据量导出和打包)
怎么验证exp导出的表正确(Export大数据量导出和打包)
2024-06-30 09:16:20  作者:来世相爱  网址:https://m.xinb2b.cn/know/cqn142756.html

怎么验证exp导出的表正确(Export大数据量导出和打包)(1)

导出生成大批量数据的文件,一个Excel中最多存有五十万条数据,查询多余五十万的数据写多个Excel中。导出完成是生成的多个Excel文件打包压缩成zip,而后更新导出记录中的压缩文件路径。

​ 大数据量文件一般采用异步生成文件,导出时首先授权生成一个流水号,而后将数据携带流水号请求导出接口。

抛开实际业务,做成一个比较公共的导出功能。

1.参数说明

{ "className": "ValideData", //导出的数据的实体类,类中有别名和顺序相关的注解 "createUser": "",//操作人 "downLoadNo": "202203181504732568468066304", //下载流水号 "fileName": "机卡绑定", //文件名 fileName HHmmssSSS.xlsx "keys": [//redis key的数据,分批获取数据 ], "remark": "机卡绑定",//备注(不关注) "type": "机卡绑定"//导出类型(不关注)}

2.坐标

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.21</version></dependency>

注:抛开导出前的参数校验,只关注导出操作 。

3.主要代码

逻辑说明:

导出前将请求参数更新到导出记录中。类加载器加载需要导出数据的实体类设置一个数据量指针,记录到每个文件的数据量达到阈值时指定文件写出到磁盘并清缓。重置数据量指针,新增一条文件记录(循环)数据量指针未到阈值时但数据已经查询完成---->>写入剩余数据查询该流水号的所有文件记录压缩文件并返回压缩文件地址更新到导出记录中

怎么验证exp导出的表正确(Export大数据量导出和打包)(2)

4.主流程

public void bigDataExport(PortDto dto) throws Exception { long start = System.currentTimeMillis(); log.info("开始导出,批次号:<{}>, 开始时间:{}", dto.getDownLoadNo(), DateUtil.now()); //修改导出记录 LambdaUpdateWrapper<PortDto> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(PortDto::getDownLoadNo, dto.getDownLoadNo()); //生成导出记录 int row = this.baseMapper.update(dto, updateWrapper); if (row > 0) { log.info("批次号:<{}>准备生成文件", dto.getDownLoadNo()); try { Iterator<String> iterator = keys.iterator(); Workbook workbook = null; ExportParams params = new ExportParams(); //加载导出数据实体类 Class<?> aClass = Class.forName(entityBasePackage dto.getClassName()); int element = 0; while (iterator.hasNext()) { String key = iterator.next(); Collection<?> list = getList(key, aClass); element = list.size(); workbook = ExcelExportUtil.exportBigExcel(params, aClass, list); //文件数据达到阈值 if (element >= maxDataCount) {String fileName = dto.getFileName() "_" DateUtil.format(new Date(), "HHmmssSSS") ".xlsx";ExcelExportUtil.closeExportBigExcel();FileOutputStream fos = new FileOutputStream(fileProp.getPath().getPath() fileName);workbook.write(fos);fos.close();element = 0;//更新地址Map<String, Object> map = new HashMap<>();map.put("downloadNo", dto.getDownLoadNo());map.put("filePath", fileProp.getPath().getPath() fileName);map.put("createTime", new Date());this.baseMapper.insertPathRecord(map);log.info("文件写入完成,文件名:{}", fileName);continue; } iterator.remove(); } //写入剩余文件 if (element != 0) { String fileName = dto.getFileName() "_" DateUtil.format(new Date(), "HHmmssSSS") ".xlsx"; ExcelExportUtil.closeExportBigExcel(); FileOutputStream fos = new FileOutputStream(fileProp.getPath().getPath() fileName); workbook.write(fos); fos.close(); element = 0; //更新地址 Map<String, Object> map = new HashMap<>(); map.put("downloadNo", dto.getDownLoadNo()); map.put("filePath", fileProp.getPath().getPath() fileName); map.put("createTime", new Date()); this.baseMapper.insertPathRecord(map); log.info("文件写入完成,文件名:{}", fileName); } long end = System.currentTimeMillis(); log.info("导出结束,批次号:<{}>, 结束时间:{}, 耗时:{}", dto.getDownLoadNo(), DateTime.of(end),DateUtil.formatBetween(end - start)); } catch (Exception e) { log.info("批次号<{}>导出异常:", dto.getDownLoadNo(), e); throw new BusinessException(""); } finally { log.info("批次号<{}>生成文件结束,准备压缩文件,修改状态", dto.getDownLoadNo()); //合并文件到导出文件记录主表 //当只有一个文件记录时直接更新主表文件地址 List<PortDto> recordList = exportDao.getPathRecord(dto); if (recordList.size() > 1) { //zipPath dto.setFilePath(zcat(dto, recordList)); } else { //xlsxPath dto.setFilePath(recordList.size()==0? "":recordList.get(0).getFilePath()); } updateWrapper.clear(); updateWrapper.set(PortDto::getFilePath, dto.getFilePath()); updateWrapper.set(PortDto::getSuccessTime, new Date()); updateWrapper.set(PortDto::getStatus, "1"); updateWrapper.eq(PortDto::getDownLoadNo, dto.getDownLoadNo()); this.baseMapper.update(null, updateWrapper); log.info("批次号<{}>更新下载记录表文件地址,修改状态成功", dto.getDownLoadNo()); } }}

5.文件压缩

private String zcat(PortDto dto, List<PortDto> recordList) throws Exception { String fileName = dto.getFileName() "_" DateUtil.format(new Date(), "HHmmssSSS") ".zip"; String zipPath = fileProp.getPath().getPath() fileName; Archiver archiver = CompressUtil.createArchiver( CharsetUtil.CHARSET_UTF_8, ArchiveStreamFactory.ZIP, new File(zipPath) ); for (PortDto portDto : recordList) { archiver.add(FileUtil.file(portDto.getFilePath())); } archiver.finish(); archiver.close(); return zipPath;}

6.查询数据

private Collection<?> getList(String key, Class<?> cls) { List<String> list = redis.getList(key); return list.stream().map(item -> JSONObject.parseObject(item, cls)).collect(Collectors.toList());}

导出还设置了队列计数器来限制同一时间最大的导出请求,使用aop在申请流水号时计数器 1,导出完成或者异常时队列计数器-1。导出完成后根据操作人发送邮件通知导出结果。

如果你觉得这篇文章对你有帮助 点赞关注,然后私信回复【888】即可获取Java进阶全套视频以及源码学习资料

怎么验证exp导出的表正确(Export大数据量导出和打包)(3)

  • 加油信怎么写(关于加油信怎么写)
  • 2024-07-01关于加油信怎么写你是运动场的心脏,跳动梦想;你是漫长路的精神,激励辉煌;你们是将上下求索的人,风为你加油,云为你助兴,坚定,执着,耐力与希望,在延伸的白色跑道中点点凝聚力量,信念,拼搏与奋斗,在遥远的终点线上渐渐明亮。
  • 桥架弯头20度计算公式(桥架弯头15度计算方法)
  • 2024-07-01桥架弯头15度计算方法以下是桥架弯头15度计算方法:一:放样量取法优点是不需要计算三角关系,只需要量出爬坡高度cd的长度,和水平距离oc长度从而确od的长度在平坦的地面上放样出如上图的直角三角形,并令oa=ob=100mm。
  • 电缆规格型号及标准(电缆型号的组成及常用电缆型号)
  • 2024-07-01电缆型号的组成及常用电缆型号一、电缆的型号由八部分组成:1、用途代码-不标为电力电缆,K为控制缆,P为信号缆;2、绝缘代码-Z油浸纸,X橡胶,V聚氯乙稀,YJ交联聚乙烯3、导体材料代码-不标为铜,L为铝;4、内护层代码-Q铅包,。
  • 西游记后传无天讲述他的来历(有5个人死得很惨)
  • 2024-07-01有5个人死得很惨《西游记后传》里其实有几个人的下场是比较惨的,首先是守山大神黑熊精其实他在《西游记》里,被观音制服后就做了守山大神其实黑熊精本性是好的,否则观音也不会收下他黑熊精可以说兢兢业业,守着南海的山林但是在后。
  • 淄博市英烈网(淄博英烈谱最可爱的人)
  • 2024-07-01淄博英烈谱最可爱的人“人固有一死,或重于泰山,或轻于鸿毛”一级人民战斗英雄李长法同志在抗日战争和解放战争中,南征北战,出生入死,多次荣立战功;在抗美援朝战争中,他又同朝鲜人民并肩战斗,不怕流血牺牲,把生命献给了朝鲜人民的。
  • 最完美的家庭组合(10个家庭登台争霸)
  • 2024-07-0110个家庭登台争霸9月5日,2020上海市民文化节赛事之一的静安现代戏剧谷“市民剧场”——中外家庭戏剧大赛决赛在大宁剧院举行,十强家庭登台为广大市民献上一场“家庭大戏”每个家庭5分钟一台戏,用戏剧展现出真挚的情感来自英。
  • 硬币是什么材质(硬币的材质)
  • 2024-07-01硬币的材质目前使用的是第四套硬币2002年11月18日发行的壹元币(1元)材质为为钢芯镀镍;伍角币(五角)为钢芯镀铜合金;壹角币(1角)为铝合金;自2005年8月31日起,发行05版年号壹角币(1角),材质由铝。
  • 高级女装结构讲解(胖体女装与正常体女装的结构差别)
  • 2024-07-01胖体女装与正常体女装的结构差别胖体女装与正常体女装的结构差别“能做好A体女装的板师不见得能做好B体”  乔雪峰一再强调这样一句话,而说话间,已经在什么正规的绘图工具都不具备的情况下,撕下一张纸折了几次当成比例尺在笔记本上非常娴熟的。
  • 问路有关的英语句型(关于问路的英语)
  • 2024-07-01关于问路的英语@英语天天talk原创文章,禁止二次修改或截取片段盗用经常出门在外的小伙伴们,会不会偶尔的路痴、迷路了找不着北呢?那咱们今天可一定要好好学习一下,关于问路指路这方面的日常英文说法了!如果咱们的小伙伴们。
  • 使命召唤最新赛季人物(上线不到两周使命召唤)
  • 2024-07-01上线不到两周使命召唤IT之家3月21日消息据外媒报道,日前官方发推表示《使命召唤:战区》玩家数已突破3000万,感谢玩家参与,并再次强调游戏免费IT之家本月曾报道《使命召唤:战区》上线三天玩家数突破1500万的消息,而距。
  • 有一种深爱叫断联系(有一种深爱叫彼此牵挂)
  • 2024-07-01有一种深爱叫彼此牵挂有一种缘分,叫聚了又散;有一种等待,叫望眼欲穿;有一种心疼,叫感同身受;有一点惦记,叫偷偷想念;有一种关心,叫默默守候;有一种感情,叫彼此挂牵生命中,有多少遇见措不及防,一个背影,转身,心就动了,一张。
  • 榴莲挑选方法妙招(关于榴莲挑选方法的妙招)
  • 2024-07-01关于榴莲挑选方法的妙招首先捏尖刺,捏住两根相邻的尖刺,如果可以轻松靠在一起说明成熟较好、比较好吃,尽量挑选大榴莲的果肉看开裂度,开口并不是越大越好,刚刚开裂的会比较好,也比较干净抓住榴莲摇一摇,果肉与外壳如果有碰撞的声音、。