#I1QU0R 数据库文档增加Word导出支持
This commit is contained in:
@@ -1,11 +1,6 @@
|
||||
package com.zyplayer.doc.db.controller;
|
||||
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.core.util.ZipUtil;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.ExcelWriter;
|
||||
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.zyplayer.doc.core.annotation.AuthMan;
|
||||
import com.zyplayer.doc.core.exception.ConfirmException;
|
||||
@@ -31,6 +26,7 @@ import com.zyplayer.doc.db.framework.db.dto.*;
|
||||
import com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper;
|
||||
import com.zyplayer.doc.db.framework.db.mapper.mysql.MysqlMapper;
|
||||
import com.zyplayer.doc.db.framework.json.DocDbResponseJson;
|
||||
import com.zyplayer.doc.db.framework.utils.PoiUtil;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang.math.NumberUtils;
|
||||
@@ -43,8 +39,6 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -280,37 +274,19 @@ public class DatabaseDocController {
|
||||
DatabaseExportVo exportVo = new DatabaseExportVo();
|
||||
exportVo.setColumnList(columnList);
|
||||
exportVo.setTableList(tableList);
|
||||
String content = JSON.toJSONString(exportVo);
|
||||
content = "var docDbDatabase = " + content;
|
||||
if (Objects.equals(exportType, 1)) {
|
||||
response.setContentType("application/octet-stream");
|
||||
response.addHeader("Content-Disposition", "attachment;filename=database.js");
|
||||
response.setCharacterEncoding("utf-8");
|
||||
// 将文件输入流写入response的输出流中
|
||||
try {
|
||||
IoUtil.write(response.getOutputStream(), "utf-8", true, content);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
response.setContentType("application/vnd.ms-excel");
|
||||
response.setCharacterEncoding("utf-8");
|
||||
String fileName = URLEncoder.encode("数据库表导出", "UTF-8");
|
||||
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
|
||||
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
|
||||
WriteSheet writeSheet = EasyExcel.writerSheet(0, "表信息").head(TableInfoVo.class).build();
|
||||
excelWriter.write(tableList, writeSheet);
|
||||
int index = 1;
|
||||
for (Map.Entry<String, List<TableColumnDescDto>> entry : columnList.entrySet()) {
|
||||
writeSheet = EasyExcel.writerSheet(index++, entry.getKey()).head(TableColumnDescDto.class).build();
|
||||
excelWriter.write(entry.getValue(), writeSheet);
|
||||
}
|
||||
excelWriter.finish();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return DocDbResponseJson.error("导出失败:" + e.getMessage());
|
||||
try {
|
||||
if (Objects.equals(exportType, 1)) {
|
||||
PoiUtil.exportByText(exportVo, response);
|
||||
} else if (Objects.equals(exportType, 2)) {
|
||||
PoiUtil.exportByXlsx(exportVo, response);
|
||||
} else if (Objects.equals(exportType, 3)) {
|
||||
PoiUtil.exportByDocx(exportVo, response);
|
||||
} else {
|
||||
return DocDbResponseJson.error("导出失败:请先选择导出类型");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return DocDbResponseJson.error("导出失败:" + e.getMessage());
|
||||
}
|
||||
return DocDbResponseJson.ok();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
package com.zyplayer.doc.db.framework.utils;
|
||||
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.ExcelWriter;
|
||||
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.zyplayer.doc.db.controller.vo.DatabaseExportVo;
|
||||
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
||||
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.poi.xwpf.usermodel.*;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
|
||||
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.math.BigInteger;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* poi导出相关工具
|
||||
*
|
||||
* @author 暮光:城中城
|
||||
* @since 2020年8月21日
|
||||
*/
|
||||
public class PoiUtil {
|
||||
|
||||
/**
|
||||
* 导出为Text
|
||||
*
|
||||
* @param exportVo
|
||||
* @param response
|
||||
* @throws Exception
|
||||
*/
|
||||
public static void exportByText(DatabaseExportVo exportVo, HttpServletResponse response) throws Exception {
|
||||
response.setContentType("application/octet-stream");
|
||||
response.addHeader("Content-Disposition", "attachment;filename=database.js");
|
||||
response.setCharacterEncoding("utf-8");
|
||||
// 将文件输入流写入response的输出流中
|
||||
String content = "var docDbDatabase = " + JSON.toJSONString(exportVo);
|
||||
IoUtil.write(response.getOutputStream(), "utf-8", true, content);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出为Excel
|
||||
*
|
||||
* @param exportVo
|
||||
* @param response
|
||||
* @throws Exception
|
||||
*/
|
||||
public static void exportByXlsx(DatabaseExportVo exportVo, HttpServletResponse response) throws Exception {
|
||||
List<TableColumnVo.TableInfoVo> tableList = exportVo.getTableList();
|
||||
Map<String, List<TableColumnDescDto>> columnList = exportVo.getColumnList();
|
||||
response.setContentType("application/vnd.ms-excel");
|
||||
response.setCharacterEncoding("utf-8");
|
||||
String fileName = URLEncoder.encode("数据库表导出", "UTF-8");
|
||||
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
|
||||
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
|
||||
WriteSheet writeSheet = EasyExcel.writerSheet(0, "表信息").head(TableColumnVo.TableInfoVo.class).build();
|
||||
excelWriter.write(tableList, writeSheet);
|
||||
int index = 1;
|
||||
for (Map.Entry<String, List<TableColumnDescDto>> entry : columnList.entrySet()) {
|
||||
writeSheet = EasyExcel.writerSheet(index++, entry.getKey()).head(TableColumnDescDto.class).build();
|
||||
excelWriter.write(entry.getValue(), writeSheet);
|
||||
}
|
||||
excelWriter.finish();
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出为Word
|
||||
*
|
||||
* @param exportVo
|
||||
* @param response
|
||||
* @throws Exception
|
||||
*/
|
||||
public static void exportByDocx(DatabaseExportVo exportVo, HttpServletResponse response) throws Exception {
|
||||
List<TableColumnVo.TableInfoVo> tableList = exportVo.getTableList();
|
||||
Map<String, List<TableColumnDescDto>> columnMap = exportVo.getColumnList();
|
||||
XWPFDocument document = new XWPFDocument();
|
||||
XWPFParagraph titleParagraph = document.createParagraph();
|
||||
titleParagraph.setAlignment(ParagraphAlignment.CENTER);
|
||||
XWPFRun titleParagraphRun = titleParagraph.createRun();
|
||||
titleParagraphRun.setText("库表信息");
|
||||
titleParagraphRun.setColor("000000");
|
||||
titleParagraphRun.setFontSize(20);
|
||||
// 所有表信息写入
|
||||
for (int i = 0; i < tableList.size(); i++) {
|
||||
TableColumnVo.TableInfoVo tableInfoVo = tableList.get(i);
|
||||
PoiUtil.createEmptyLine(document);
|
||||
XWPFParagraph firstParagraph = document.createParagraph();
|
||||
XWPFRun run = firstParagraph.createRun();
|
||||
// 写入标题
|
||||
String description = StringUtils.isBlank(tableInfoVo.getDescription()) ? "" : "(" + tableInfoVo.getDescription() + ")";
|
||||
run.setText(String.format("%s. %s%s", (i + 1), tableInfoVo.getTableName(), description));
|
||||
run.setColor("000000");
|
||||
run.setFontSize(18);
|
||||
List<List<String>> dataList = new LinkedList<>();
|
||||
List<TableColumnDescDto> tableColumnDescDtos = columnMap.get(tableInfoVo.getTableName());
|
||||
dataList.add(Arrays.asList("字段名", "是否自增", "类型", "NULL", "长度", "主键", "注释"));
|
||||
// 写入表格
|
||||
for (TableColumnDescDto dto : tableColumnDescDtos) {
|
||||
dataList.add(Arrays.asList(dto.getName(), dto.getIsidenity(), dto.getType(),
|
||||
dto.getNullable(), dto.getLength(), dto.getIspramary(), dto.getDescription()));
|
||||
}
|
||||
PoiUtil.createTable(document, dataList);
|
||||
}
|
||||
response.setContentType("application/vnd.ms-excel");
|
||||
response.setCharacterEncoding("utf-8");
|
||||
String fileName = URLEncoder.encode("数据库表导出", "UTF-8");
|
||||
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
|
||||
ServletOutputStream outputStream = response.getOutputStream();
|
||||
document.write(outputStream);
|
||||
outputStream.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建Word的表格
|
||||
*/
|
||||
private static void createTable(XWPFDocument document, List<List<String>> dataList) {
|
||||
XWPFTable infoTable = document.createTable();
|
||||
//列宽自动分割
|
||||
CTTblWidth infoTableWidth = infoTable.getCTTbl().addNewTblPr().addNewTblW();
|
||||
infoTableWidth.setType(STTblWidth.DXA);
|
||||
infoTableWidth.setW(BigInteger.valueOf(9072));
|
||||
for (int i = 0; i < dataList.size(); i++) {
|
||||
XWPFTableRow xwpfTableRow;
|
||||
String bgColor = null;
|
||||
if (i == 0) {
|
||||
bgColor = "eeeeee";
|
||||
xwpfTableRow = infoTable.getRow(0);
|
||||
} else {
|
||||
xwpfTableRow = infoTable.createRow();
|
||||
}
|
||||
PoiUtil.createTableLine(xwpfTableRow, i, dataList.get(i), bgColor);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建Word一个空白行
|
||||
*/
|
||||
private static void createEmptyLine(XWPFDocument document) {
|
||||
XWPFParagraph paragraph1 = document.createParagraph();
|
||||
XWPFRun paragraphRun1 = paragraph1.createRun();
|
||||
paragraphRun1.setText("\r");
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建Word表格的一行
|
||||
*/
|
||||
private static void createTableLine(XWPFTableRow xwpfTableRow, int index, List<String> titleList, String bgColor) {
|
||||
for (int i = 0; i < titleList.size(); i++) {
|
||||
XWPFTableCell cell;
|
||||
if (i == 0 || index > 0) {
|
||||
cell = xwpfTableRow.getCell(i);
|
||||
} else {
|
||||
cell = xwpfTableRow.addNewTableCell();
|
||||
}
|
||||
cell.setText(titleList.get(i));
|
||||
if (StringUtils.isNotBlank(bgColor)) {
|
||||
cell.getCTTc().addNewTcPr().addNewShd().setFill(bgColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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/app.62e1fd5d.css rel=preload as=style><link href=css/chunk-vendors.7be40bfc.css rel=preload as=style><link href=js/app.0586919e.js rel=preload as=script><link href=js/chunk-vendors.8274a50c.js rel=preload as=script><link href=css/chunk-vendors.7be40bfc.css rel=stylesheet><link href=css/app.62e1fd5d.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.8274a50c.js></script><script src=js/app.0586919e.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/app.9aaf8b21.css rel=preload as=style><link href=css/chunk-vendors.7be40bfc.css rel=preload as=style><link href=js/app.ff5f6236.js rel=preload as=script><link href=js/chunk-vendors.8274a50c.js rel=preload as=script><link href=css/chunk-vendors.7be40bfc.css rel=stylesheet><link href=css/app.9aaf8b21.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.8274a50c.js></script><script src=js/app.ff5f6236.js></script></body></html>
|
||||
File diff suppressed because one or more lines are too long
@@ -14,6 +14,7 @@
|
||||
<el-radio-group v-model="exportType">
|
||||
<el-radio :label="1">HTML格式</el-radio>
|
||||
<el-radio :label="2">Excel格式</el-radio>
|
||||
<el-radio :label="3">Word格式</el-radio>
|
||||
</el-radio-group>
|
||||
<el-button v-on:click="exportChoiceTable" type="primary" style="margin: 0 10px 0 20px;">导出选中的表</el-button>
|
||||
<a target="_blank" title="点击查看如何使用" href="http://doc.zyplayer.com/zyplayer-doc-manage/doc-wiki#/page/share/view?pageId=117&space=23f3f59a60824d21af9f7c3bbc9bc3cb"><i class="el-icon-info" style="color: #999;"></i></a>
|
||||
|
||||
Reference in New Issue
Block a user