🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# :-: 数据导出 一、总体流程如下 数据导出采用异步任务方式处理。用户先在页面点击导出数据按钮执行创建一个导出任务,专门的任务对其执行具体的导出任务。执行完毕后会生成一个csv文件存储在OSS。用户去下载中心可以查看并下载文件 ![](https://img.kancloud.cn/de/c9/dec931e2d0387f40b2c78d126c639741_1267x158.png) 二、流程说明 1、创建任务: A:准备好导出sql模板语句 放在common\_query\_template 表。需要符合mybatis 标准 B:页面执行点击导出操作,请求接口/data/export 参数包含 导出名称 导出数据列 查询条件 模板SQL的keyCode等。 C:接口将导出的请求验证之后存储在common\_export 表。 ~~~ CommonQueryTemplate queryTemplate = queryService.getCommonQueryTemplate(request.getExportKey()); AssertUtil.notNull(queryTemplate, "参数有误!"); CommonExport commonExport=new CommonExport(); commonExport.setExportKey(request.getExportKey()); commonExport.setExportName(request.getExportName()); commonExport.setQueue(JSONObject.toJSONString(request)); commonExport.setUserId(AdminContextUtil.getMyId()); commonExport.setStatus(0); int r=commonExportMapper.insert(commonExport); ~~~ 2、发送MQ消息: 创建任务后系统发送一个MQ消息 消息的内容是导出任务表的ID ~~~ kafkaSender.sendMsg(MsgConf.Topics.Export,commonExport.getId()); ~~~ 3、消费MQ消息: 导出的Topic接收到消息之后执行导出的任务 ~~~ @Component @Slf4j public class ExportListener { @Resource ExportService exportService; @KafkaListener(id="Export",topics = "Export" ) public void onMessage0( ConsumerRecord r){ log.info("【ExportListener消息消费接收到消息key....{}.....value....{}",r.key(),r.value()); Object value=r.value().toString(); exportService.export(Long.parseLong(value.toString())); } } ~~~ 根据导出任务的条件执行模板SQL语句。然后将查询到的数据存储在csv 文件中。将生成的csv文件存放到阿里云的OSS中。导出任务完成。 ~~~ /** * 导出数据 */ public void export(Long id){ CommonExport commonExportUpdate=new CommonExport(); commonExportUpdate.setId(id); QuerySQLContext.remove(); try { log.info("【导出数据】.....id{}",id); CommonExport commonExport = commonExportMapper.selectById(id); AssertUtil.isTrue(commonExport!=null, "数据导出失败"); if (commonExport.getStatus()==1) { log.error("【导出数据】数据正在导出......停止本次导出"); return; } if (commonExport.getStatus() == 2) { log.error("【导出数据】数据导出失败......停止本次导出"); return; } log.info("【导出数据】....commonExport.....{}",commonExport); CommonQueryTemplate queryTemplate = queryService.getCommonQueryTemplate(commonExport.getExportKey()); AssertUtil.notNull(queryTemplate, "【导出数据】queryTemplate==null"); ExportDataReq exportDataReq = JSONObject.parseObject(commonExport.getQueue(),ExportDataReq.class); QuerySQLContext.set(getQuerySqlTemplate(queryTemplate)); String fileName ="export/" + commonExport.getExportName().concat(".csv"); commonExportUpdate.setStatus(1); commonExportMapper.updateById(commonExportUpdate); exportData(exportDataReq, commonExport, fileName, 0L); commonExportUpdate.setStatus(2); commonExportUpdate.setUrl(ConfUtil.serverFileUrl+fileName); commonExportMapper.updateById(commonExportUpdate); }catch (Exception e){ log.error("【导出数据】........发生异常......{}",e); if (commonExportUpdate.getId() != null) { commonExportUpdate.setErrorDesc(e.getMessage()); commonExportUpdate.setStatus( 3); commonExportMapper.updateById(commonExportUpdate); } e.printStackTrace(); } } /** * 数据导出执行 */ private void exportData(ExportDataReq exportDataReq ,CommonExport data, String fileName,Long nextPoint) { JSONObject search = exportDataReq.getSearchParam(); search.put(TemplateKit.PAGE_SIZE, 1000); List<Map> expDataList =ObjectUtils.defaultIfNull(queryService.queryExportData(search),new ArrayList<>()); ExcelDataUtils.ExcelHeaderData excelHeaderData = ExcelDataUtils.builderHeaderAndData(exportDataReq.getExportColumn().stream() .map(ExportDataReq.Column::getKey).collect(Collectors.toList()), exportDataReq.getExportColumn().stream() .map(ExportDataReq.Column::getValue).collect(Collectors.toList()), expDataList); File file = new File("export_" + data.getExportName() + ".csv"); List<String[]> arrayList = new ArrayList<>(); if (nextPoint <= 0) { arrayList.add(excelHeaderData.getHeader()); } arrayList.addAll(excelHeaderData.getData()); CsvUtil.write(file, arrayList); data.setTotal(ObjectUtils.defaultIfNull(data.getTotal(), 0L) + expDataList.size()); log.info("【数据导出执行】:{},total:{},dataSize:{}", fileName, data.getTotal(), excelHeaderData.getData().size()); if (excelHeaderData.getData().size() > 0) { search.put(TemplateKit.PAGE_NUMBER, ObjectUtils.defaultIfNull(search.getLong(TemplateKit.PAGE_NUMBER), 0L) + 1); nextPoint = OSSClientUtil.appendUpload(fileName, file, nextPoint); exportData(exportDataReq, data, fileName, nextPoint); } } ~~~ 4、导出文件下载 导出的任务完成之后会将下载文件的URL写入common\_export 表。下载中心下载相应的数据 ![](https://img.kancloud.cn/ef/00/ef00796d756c2db62701104b08aa1003_1525x1071.png)