研发文档对于开发人员来说都不陌生了,而研发文档里重要的一部分就是表结构设计,需要我们在word建个表格把我们数据库中的表字段信息填进去,表多的话靠我们手动去填非常累人!!!
因此作为开发人员可不可以写段代码,自动帮我把数据库表及字段信息封装成表格导出到word中呢?
当然可以
sql
-- 该sql可以返回表字段信息
SHOW FULL FIELDS FROM base_user
这个sql就可以返回我们需要查的表字段信息
++那思路就有了,我们把查到的信息进行封装,利用poi导出到word中++
1、创建实体类接收数据库表信息
sql
package com.javacoding.entity;
import lombok.Data;
@Data
public class TableStruct {
private String field;
private String type;
private String comment;
}
2、接口实现
java
@GetMapping("/dbtable")
public void dbTableExport(HttpServletResponse response) {
poiTestService.export(response);
}
java
public void export(HttpServletResponse response) {
try {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("表结构注释说明" + LocalDate.now().toString(), "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".docx");
// 创建文档
XWPFDocument document = new XWPFDocument();
//设置标题
XWPFStyles styles = document.createStyles();
String heading1StyleId = "heading1";
addCustomHeadingStyle(styles, heading1StyleId, "标题 1", 1);
// 需要导出的表名
List<String> tables = new ArrayList<>();
tables.addAll(Arrays.asList("base_user"));
tables.forEach(temp -> {
//生成标题
XWPFParagraph title1Paragraph = document.createParagraph();
title1Paragraph.setStyle(heading1StyleId);
XWPFRun title1Run = title1Paragraph.createRun();
title1Run.setText(temp);
//生成表头
List<TableStruct> tableInfo = poiTestMapper.getTableInfo(temp);
XWPFTable table = document.createTable(tableInfo.size() + 1, 3);
table.setWidth("100%");
table.getRow(0).getCell(0).setText("字段名称");
table.getRow(0).getCell(1).setText("字段类型");
table.getRow(0).getCell(2).setText("字段描述");
//生成表内容 第0行已经设置为表头,因此我们需要从第一行开始
for (int row = 0; row < tableInfo.size(); row++) {
table.getRow(row + 1).getCell(0).setText(tableInfo.get(row).getField());
table.getRow(row + 1).getCell(1).setText(tableInfo.get(row).getType());
table.getRow(row + 1).getCell(2).setText(tableInfo.get(row).getComment());
}
});
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
document.write(byteArrayOutputStream);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(byteArrayOutputStream.toByteArray());
outputStream.flush();
outputStream.close();
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void addCustomHeadingStyle(XWPFStyles styles, String styleId, String styleName, int headingLevel) {
CTStyle ctStyle = CTStyle.Factory.newInstance();
ctStyle.setStyleId(styleId);
CTString styleNameString = CTString.Factory.newInstance();
styleNameString.setVal(styleName);
ctStyle.setName(styleNameString);
CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
indentNumber.setVal(BigInteger.valueOf(headingLevel));
CTPPr ppr = CTPPr.Factory.newInstance();
ppr.setOutlineLvl(indentNumber);
ctStyle.setPPr(ppr);
XWPFStyle style = new XWPFStyle(ctStyle);
styles.addStyle(style);
}
上述代码我只导出了三个字段,如果需要其他字段按照逻辑自行添加即可。
看下效果图:
OK,打完收工!!!