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


导出生成大批量数据的文件,一个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.主要代码

逻辑说明:

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


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进阶全套视频以及源码学习资料


  • 嘞嘞是什么意思(嘞嘞的意思)
  • 2024-11-22嘞嘞的意思嘞嘞,拼音lēle,汉语词语,意思是话多,一直不停的说,贬义词〈方〉:能说,说个没完贬义词,形容话多的人东北地方方言,基本上用于玩笑,多数盛行于东北民间他最能嘞嘞你穷嘞嘞什么。
  • 做面包用高筋粉还是面包专用粉,做面包一定要用面包专用粉么
  • 2024-11-22做面包用高筋粉还是面包专用粉,做面包一定要用面包专用粉么今天是2月18日,我的烘焙日记第3天儿子网络上课几乎一整天都占着电脑,也给我带来了问题搞得我现在几乎都没什么时间视频编辑了于是乎,又开始研究新口味面包,不过进展有些缓慢,忙了一天,就做了两种口味有小伙。
  • 盘点庆余年搞笑人物(庆余年又一开心果)
  • 2024-11-22庆余年又一开心果随着热播剧《庆余年》的剧情发展,虎卫首领高达也正式亮相一登场便让男主范闲颇为惊讶,不但肃然起敬的表示久仰,还称自己养了一匹小马叫扎古,说有时间要让他们见上一面毕竟这个名字,对于现代人来说还是十分熟悉的。
  • hpv感染有什么症状是怎么得的(HPV感染有哪些常见表现)
  • 2024-11-22HPV感染有哪些常见表现人乳头瘤病毒(HPV),大家应该并不陌生可以说,很多人都听说过HPV,然后就是,恐惧它毕竟,这是一种可以造成癌症的病毒,而且当年梅艳芳就是死于这种癌症其实,HPV并没有那么可怕,发现感染HPV阳性,也。
  • 汉皇帝刘盈简介(汉惠帝刘盈7个儿子的生平简介)
  • 2024-11-22汉惠帝刘盈7个儿子的生平简介史书记载汉惠帝刘盈有7个儿子,但都不是正牌皇后张嫣所生,史书也并未记载她们的生母刘盈的一生笼罩在母亲吕雉残忍的阴影之下,23岁就英年早逝了刘盈死后,母亲吕雉临朝称制,降封刘氏,分封吕氏,因而造成刘盈的。
  • 父亲的去世让她悲痛欲绝(父亲的突然离世)
  • 2024-11-22父亲的突然离世病房里的床上,一个中年男人侧躺着,面色苍白,气若游丝病痛将他折磨得如此瘦弱,以至于白色的病号服穿在他身上如同套在一个衣架子上一般,空荡荡的床边,十岁的言月沙失声痛哭,泪水打湿了她的脸她以为自己像往常那。
  • 最残暴的暴君刘子业(北汉景宗刘继恩)
  • 2024-11-22北汉景宗刘继恩(北汉王朝)天会十二年,公元968年,北汉王朝第二任皇帝,北汉睿宗刘钧病逝了北汉,是五代十国时期,十国中的一个政权,都城在山西太原,其势力范围,大概在今天的山西中部和北部,所辖不过十二个州府,是五代十。
  • 浪客剑心真人版最终篇(浪客剑心漫改最强剧)
  • 2024-11-22浪客剑心漫改最强剧时间来到2021年,《浪客剑心》追忆篇也落下了帷幕作为《浪客剑心》感情上最重要的一幕,追忆篇在上映之前就引起了很多动漫迷的期待真人版的《浪客剑心》是我心中最好的漫改剧,不仅是因为他在人物形象上的还原,。
  • 小s接梗完整版(小S再现迷惑发言)
  • 2024-11-22小S再现迷惑发言饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!5月28日深夜,小S突然在社交平台高调喊话“我爱具先生”,并且还在评论区激动发文表示想要吻他的嘴唇,消息曝光后瞬间引发热议小S的发文令很多网。
  • 熊孩子弄坏天价玩具(熊孩子撞碎天价潮玩)
  • 2024-11-22熊孩子撞碎天价潮玩本文来源:时代周报作者:李馨婷一件“天价潮玩”,近日登上热搜一开始以为是“熊孩子”闯祸,接下来又迎来反转据媒体报道,5月22日,香港旺角朗豪坊KKplus玩具店内,一男孩打碎了店内一件1.8米高的天线。