怎么验证exp导出的表正确(Export大数据量导出和打包)
怎么验证exp导出的表正确(Export大数据量导出和打包)
2024-06-30 04:24:32  作者:来世相爱  网址:https://m.xinb2b.cn/sport/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-06-30写给妻子生日的信 写给妻子六十五岁生日的一封信亲爱的妻子:你好!今天是你65岁的生日,也是我们进入红宝石婚年,致此向你祝贺!时间真快,我们携手不知不觉的走过了41年你从大姑娘到小媳妇,小媳妇到白发老太太,我们像许许多多的夫妻一样,走过了从青丝到白。
  • 梦见凤凰嘴里叼桑椹树寓意(梦见凤凰嘴里叼桑椹树的含义)
  • 2024-06-30梦见凤凰嘴里叼桑椹树的含义出行的人梦见凤凰嘴里叼桑椹树,建议外出波折多,延后外出上学的人梦见凤凰嘴里叼桑椹树,意味着没有恒心再试,不可能录取做生意的人梦见凤凰嘴里叼桑椹树,代表产品的包装要加强,目前营业未达理想本命年的人梦见凤。
  • 毛孔粗大怎么改善收缩毛孔的方法(毛孔粗大真的有救)
  • 2024-06-30毛孔粗大真的有救毛孔粗大真的有救!!科学,低成本缩小毛孔的秘诀!你是不是经常用收敛水来湿敷?期待自己毛孔变小,结果皮肤越来越敏感!毛孔却还是那么大!你是不是买遍了市面上所有收缩毛孔的精华产品但是毛孔还是大的能插秧!毛。
  • 姜超吃梨是哪部电影(电影巨额来电热映)
  • 2024-06-30电影巨额来电热映(姜超剧照)(姜超蒋梦婕桂纶镁)(《巨额来电》)娄底新闻网讯由电影频道节目中心、寰宇娱乐有限公司、浙江横店影业有限公司、优酷电影(香港)有限公司等联合出品,彭顺执导,陈学冬、张孝全、桂纶镁、蒋梦婕、姜。
  • 英语要怎么学才能达到会说的程度?英语要学成什么样才算学会了
  • 2024-06-30英语要怎么学才能达到会说的程度?英语要学成什么样才算学会了英语学习有没有尽头?学到什么程度,才算学好了,学会了呢?芬兰之行,我得到了我的答案:当我们脱离文字和场景的辅助,还能听懂英语的演讲和报告,我才觉得自己是真正学会了英语可是,这条路从一开始我们就走错了我。
  • 长得像蜥蜴长得又像鱼是什么动物(像青蛙又像蜥蜴的危险动物)
  • 2024-06-30像青蛙又像蜥蜴的危险动物蝾螈是一种小型半水栖的两栖动物,经常被人误认为是青蛙和蜥蜴,长得有点像二者的杂交种蝾螈是一种神奇的动物,它看起来萌萌的,人畜无害,实际上它很危险它的皮下藏着可致人于死的毒素此外,它也具有四肢和器官再生。
  • 让我们荡起双桨原唱是哪个歌手(让我们荡起双桨)
  • 2024-06-30让我们荡起双桨6月19日晚,著名词作家乔羽先生因病在北京逝世提起乔羽这个名字,大家或许会觉得陌生,但只要提起他写的歌,我中华儿女必定是无人不知、无人不晓难忘今宵难忘今宵……1984年春晚,李谷一老师带着这首《难忘今。
  • 怎样去除发泡胶痕迹
  • 2024-06-30怎样去除发泡胶痕迹四种方法可以去除:妙招一可以用浓度高的稀释剂---香蕉水清洗,但是材质不能是表面为油漆的,要不会把油漆的颜色也跟着一起刷掉用刷墙用来和和水泥的小铁铲讲附着在胶表面的那层泡沫刮去不用担心会刮花,然后用油。
  • 全球新商业版图(打破外资一家独大)
  • 2024-06-30打破外资一家独大  文|华商韬略酥酥  大健康趋势正席卷全球,不管是为了补充营养,还是抗疲劳、抗焦虑,功能性饮料都十分契合  而功能性饮料细分品类下,能量饮料可谓炙手可热,据欧睿咨询数据显示,2021年,中国能量饮料。
  • 幼儿园环境创设主题墙设计图(幼儿园经典主题墙环境创设)
  • 2024-06-30幼儿园经典主题墙环境创设幼儿园主题墙的布置连翘迎春快乐小学恐龙世界快乐的节日就要毕业了放眼看世界(英语)报纸环保圣诞树墙面布置——秋天真美丽海底世界1海底世界2地球日光盘创意手工各种食物大聚餐我居住的小区我的小书包我们来动物。
  • 墨西哥展会排期(去一次墨西哥吧)
  • 2024-06-30去一次墨西哥吧拉斯维加斯,迷情墨西哥、“美国后花园—坎昆”...原来与我们日夜颠倒的另一个半球,有着那样不同的人和风景CES2019,希望我们要不负展会,也要不负旅途上的每一道风景......2019年(第52届)。