#I1QU0R 数据库文档增加Word导出支持

This commit is contained in:
暮光:城中城
2020-08-22 10:20:44 +08:00
parent 6d2e24f455
commit 44ebfbf554
6 changed files with 185 additions and 39 deletions

View File

@@ -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();
}

View File

@@ -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);
}
}
}
}

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/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>

View File

@@ -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>