表数据支持Excel格式导出

This commit is contained in:
暮光:城中城
2021-08-15 13:40:59 +08:00
parent fa725edd90
commit 3b2abbf19f
9 changed files with 169 additions and 43 deletions

View File

@@ -1,24 +1,16 @@
package com.zyplayer.doc.db.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.util.TypeUtils;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.core.util.StringUtil;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.support.consts.DocAuthConst;
import com.zyplayer.doc.db.controller.download.FormatDownloadConst;
import com.zyplayer.doc.db.controller.download.FormatDownloadService;
import com.zyplayer.doc.db.controller.param.DataViewParam;
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
import com.zyplayer.doc.db.framework.consts.DbAuthType;
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteResult;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteType;
@@ -41,8 +33,6 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 表数据查看控制器

View File

@@ -0,0 +1,160 @@
package com.zyplayer.doc.db.controller.download;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zyplayer.doc.db.controller.param.DataViewParam;
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteParam;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteResult;
import com.zyplayer.doc.db.framework.db.mapper.base.ExecuteType;
import com.zyplayer.doc.db.framework.db.mapper.base.SqlExecutor;
import com.zyplayer.doc.db.service.common.ExecuteAuthService;
import com.zyplayer.doc.db.service.database.DatabaseServiceFactory;
import com.zyplayer.doc.db.service.database.DbBaseService;
import com.zyplayer.doc.db.service.download.BaseDownloadService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.net.URLEncoder;
import java.sql.Timestamp;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* excel格式化数据下载服务
*
* @author 暮光:城中城
* @since 2021-08-14
*/
@Service(FormatDownloadConst.EXCEL)
public class ExcelFormatDownloadService implements FormatDownloadService {
private static Logger logger = LoggerFactory.getLogger(ExcelFormatDownloadService.class);
@Resource
ExecuteAuthService executeAuthService;
@Resource
DatabaseServiceFactory databaseServiceFactory;
@Resource
BaseDownloadService baseDownloadService;
@Resource
SqlExecutor sqlExecutor;
@Override
public void download(HttpServletResponse response, DataViewParam param, String[] tableNameArr) throws Exception {
DbBaseService dbBaseService = databaseServiceFactory.getDbBaseService(param.getSourceId());
boolean multipleFile = Objects.equals(param.getDownloadFileType(), 2);
JSONObject conditionMap = StringUtils.isBlank(param.getConditionJson()) ? new JSONObject() : JSON.parseObject(param.getConditionJson());
JSONObject conditionColumnMap = StringUtils.isBlank(param.getConditionColumnJson()) ? new JSONObject() : JSON.parseObject(param.getConditionColumnJson());
JSONObject getRetainColumnMap = StringUtils.isBlank(param.getRetainColumnJson()) ? new JSONObject() : JSON.parseObject(param.getRetainColumnJson());
// 结果
String tempDir = System.getProperty("java.io.tmpdir");
String tempDirName = tempDir + "zyplayer-doc-" + IdUtil.fastSimpleUUID();
ExcelWriter excelWriter = null;
boolean excelWriterIsFinish = false;
try {
String suffix = ".xlsx";
if (!multipleFile) {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileNameOrigin = "数据库表数据导出." + DateTime.now().toString("yyyyMMddHHmmss");
String fileName = URLEncoder.encode(fileNameOrigin, "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + suffix);
excelWriter = EasyExcel.write(response.getOutputStream()).build();
}
// 创建临时文件夹
FileUtil.mkdir(tempDirName);
// 再分表查数据
int tableIndex = 0;
for (String tableName : tableNameArr) {
param.setTableName(tableName);
param.setCondition(conditionMap.getString(tableName));
param.setConditionColumn(conditionColumnMap.getString(tableName));
param.setRetainColumn(getRetainColumnMap.getString(tableName));
ExecuteType executeType = executeAuthService.getExecuteType(param.getSourceId());
// 获取列信息等
TableColumnVo tableColumnVo = dbBaseService.getTableColumnList(param.getSourceId(), param.getDbName(), tableName);
List<TableColumnDescDto> columnList = tableColumnVo.getColumnList();
// 保留的列
Set<String> retainColumnSet = StringUtils.isBlank(param.getRetainColumn()) ? Collections.emptySet() : Stream.of(param.getRetainColumn().split(",")).collect(Collectors.toSet());
List<TableColumnDescDto> columnListRetain = columnList.stream().filter(item -> retainColumnSet.isEmpty() || retainColumnSet.contains(item.getName())).collect(Collectors.toList());
// 数据查询
String queryAllSql = dbBaseService.getQueryAllSql(param);
ExecuteParam executeParam = new ExecuteParam();
executeParam.setDatasourceId(param.getSourceId());
executeParam.setExecuteId(param.getExecuteId());
executeParam.setExecuteType(executeType);
executeParam.setSql(queryAllSql);
ExecuteResult executeResult = sqlExecutor.execute(executeParam);
List<Map<String, Object>> executeResultData = executeResult.getResult();
if (CollectionUtils.isEmpty(executeResultData)) {
executeResultData = Collections.emptyList();
if (StringUtils.isNotBlank(executeResult.getErrMsg())) {
logger.error("执行sql失败{} {}", executeResult.getSql(), executeResult.getErrMsg());
}
}
// 处理成表格下载所需格式
List<List<Object>> downloadDataList = new LinkedList<>();
for (Map<String, Object> dataMap : executeResultData) {
downloadDataList.add(new LinkedList<Object>() {{
for (TableColumnDescDto columnDto : columnListRetain) {
Object data = dataMap.get(columnDto.getName());
// 数据格式处理,不处理有些格式会造成乱码,打不开文件
if (!(data == null || data instanceof Number || data instanceof CharSequence)) {
if (data instanceof Timestamp) {
data = DateTime.of(((Timestamp) data).getTime()).toJdkDate();
} else {
data = String.valueOf(data);
}
}
add(data);
}
}});
}
List<List<String>> sheetHeadList = this.getSheetHeadList(columnListRetain);
if (multipleFile) {
// 写入临时文件
File tempFile = FileUtil.file(tempDirName + "/" + tableName + suffix);
EasyExcel.write(tempFile).head(sheetHeadList).sheet(tableName).doWrite(downloadDataList);
} else {
WriteSheet writeSheet = EasyExcel.writerSheet(tableIndex++, tableName).head(sheetHeadList).build();
excelWriter.write(downloadDataList, writeSheet);
}
}
if (multipleFile) {
baseDownloadService.sendResponse(response, param.getDbName(), tempDirName);
} else {
excelWriter.finish();
excelWriterIsFinish = true;
}
} finally {
FileUtil.del(tempDirName);
if (excelWriterIsFinish && excelWriter != null) {
excelWriter.finish();
}
}
}
private List<List<String>> getSheetHeadList(List<TableColumnDescDto> columnListRetain) {
List<List<String>> sheetHeadList = new ArrayList<>();
for (TableColumnDescDto dataCol : columnListRetain) {
sheetHeadList.add(new ArrayList<String>() {{
add(dataCol.getName());
}});
}
return sheetHeadList;
}
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.support.consts.DocAuthConst;
import com.zyplayer.doc.db.controller.download.FormatDownloadConst;
import com.zyplayer.doc.db.controller.param.DataViewParam;
import com.zyplayer.doc.db.controller.param.ProcedureListParam;
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
@@ -354,27 +355,6 @@ public abstract class DbBaseService {
return sqlSb.toString();
}
/**
* 导出单表数据
*
* @author 暮光:城中城
* @since 2020年6月5日
*/
public void downloadSingleTableData(HttpServletResponse response, DataViewParam param, ExecuteParam executeParam, List<TableColumnDescDto> dataCols, Set<String> conditionSet) throws Exception {
DatabaseProductEnum databaseProduct = databaseServiceFactory.getDbBaseService(param.getSourceId()).getDatabaseProduct();
DownloadService downloadService = databaseServiceFactory.getDownloadService(databaseProduct);
if (Objects.equals(param.getDownloadType(), "insert")) {
String resultStr = downloadService.downloadDataByInsert(param, executeParam, dataCols, conditionSet);
baseDownloadService.sendResponse(response, param.getTableName(), ".sql", resultStr);
} else if (Objects.equals(param.getDownloadType(), "update")) {
String resultStr = downloadService.downloadDataByUpdate(param, executeParam, dataCols, conditionSet);
baseDownloadService.sendResponse(response, param.getTableName(), ".sql", resultStr);
} else if (Objects.equals(param.getDownloadType(), "json")) {
String resultStr = downloadService.downloadDataByJson(param, executeParam, dataCols, conditionSet);
baseDownloadService.sendResponse(response, param.getTableName(), ".json", resultStr);
}
}
/**
* 获取表数据
*
@@ -384,11 +364,11 @@ public abstract class DbBaseService {
public String getDownloadTableData(DataViewParam param, ExecuteParam executeParam, List<TableColumnDescDto> dataCols, Set<String> conditionSet) throws Exception {
DatabaseProductEnum databaseProduct = databaseServiceFactory.getDbBaseService(param.getSourceId()).getDatabaseProduct();
DownloadService downloadService = databaseServiceFactory.getDownloadService(databaseProduct);
if (Objects.equals(param.getDownloadType(), "insert")) {
if (Objects.equals(param.getDownloadType(), FormatDownloadConst.INSERT)) {
return downloadService.downloadDataByInsert(param, executeParam, dataCols, conditionSet);
} else if (Objects.equals(param.getDownloadType(), "update")) {
} else if (Objects.equals(param.getDownloadType(), FormatDownloadConst.UPDATE)) {
return downloadService.downloadDataByUpdate(param, executeParam, dataCols, conditionSet);
} else if (Objects.equals(param.getDownloadType(), "json")) {
} else if (Objects.equals(param.getDownloadType(), FormatDownloadConst.JSON)) {
return downloadService.downloadDataByJson(param, executeParam, dataCols, conditionSet);
}
return null;

View File

@@ -159,11 +159,7 @@ public class BaseDownloadService implements DownloadService {
for (TableColumnDescDto dataCol : dataCols) {
result.put(dataCol.getName(), item.get(dataCol.getName()));
}
String resultData = result.toJSONString();
if (resultSb.length() > 1) {
resultSb.append(",");
}
resultSb.append(resultData);
resultSb.append((resultSb.length() > 1) ? "," : "").append(result.toJSONString());
});
resultSb.append("]\n");
return resultSb.toString();

View File

@@ -1 +1 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon-db.png><title>数据库文档管理</title><link href=css/chunk-vendors.8924efc6.css rel=preload as=style><link href=css/index.2a7107f3.css rel=preload as=style><link href=js/chunk-vendors.333ced1f.js rel=preload as=script><link href=js/index.ea0404ed.js rel=preload as=script><link href=css/chunk-vendors.8924efc6.css rel=stylesheet><link href=css/index.2a7107f3.css rel=stylesheet></head><body><noscript><strong>We're sorry but zyplayer-db-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.333ced1f.js></script><script src=js/index.ea0404ed.js></script></body></html>
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon-db.png><title>数据库文档管理</title><link href=css/chunk-vendors.8924efc6.css rel=preload as=style><link href=css/index.2a7107f3.css rel=preload as=style><link href=js/chunk-vendors.333ced1f.js rel=preload as=script><link href=js/index.d7e1d74e.js rel=preload as=script><link href=css/chunk-vendors.8924efc6.css rel=stylesheet><link href=css/index.2a7107f3.css rel=stylesheet></head><body><noscript><strong>We're sorry but zyplayer-db-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.333ced1f.js></script><script src=js/index.d7e1d74e.js></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long