利用数据库的表,生成word文档的表结构注释说明

1.场景说明

在项目中表已经建立好了,但是现在想对外提供一个表的字段的描述说明,该怎么办。例如开发前期赶进度,也没个什么数据库的需求,设计文档之类的,项目开发后期,现在要补充文档了,表要是少,那就挨个复制粘贴了,多的话,复制粘贴也麻烦。

例如,这是某个表
在这里插入图片描述

希望最后在word文档中提供这样的表结构说明
在这里插入图片描述

2.解决办法

1.根据建表的语句挨个的复制呗,还能怎么办,适用于表量比较少,然后技术比较菜的人,如果数据库的表有个七八十,上百张,相信我,真的有人挨个的将SQL客户端工具打开,然后挨个的复制到文档里面去。然后时候说自己工作很多,加班很晚才弄完。
2.有点学习技术需求,不至于太菜的,虽然我没去找过有没有,但是我相信这种网上肯定有一堆人已经实现将数据库表结构转换成word文档的代码或者示例,所以我觉得,只要不是太菜,一下午也能解决了。
3.直接让GPT转换了,导出建表语句,给GPT一个示例,然后GPT来做

例如如下,导出一个建表语句,然后再最上面给出一个示例,然后接下来就交给GPT了
在这里插入图片描述
在这里插入图片描述

4.接下来才是本文的重头戏,带着学习的成分,我们去造轮子,当然了,不是造GPT,咱没有那个本事,咱们自己写一个组件来实现,根据数据库逆向生成表结构的文档说明

造轮子,根据数据库表生成文档

3.生成文档

3.1.实现思路

1.获取到所有的表,根据你使用的数据库,查询表,例如我用mysql,因此用下面的语句查看表名

SHOW TABLES;

在这里插入图片描述
2.获取表的字段描述说明

SHOW FULL FIELDS FROM <表名>

在这里插入图片描述

3.利用步骤1和步骤2的表名、表结构信息,生成多个word表格,
java中生成word的技术有很多

  1. Apache POI:Apache POI是一个开源的Java库,用于读取和写入Microsoft
    Office格式的文件,包括Word文档(.doc和.docx)。它提供了丰富的API和类,可以操作和处理Word文档的内容、格式、样式和元数据等。

  2. Docx4j:Docx4j是一个用于创建和操作.docx文件的Java库。它提供了许多API和类,可以通过编程方式创建、修改和处理Word文档。Docx4j还支持生成PDF、HTML和其他格式的文档。

  3. Apache POI XWPF:Apache POI XWPF是Apache
    POI库的扩展,专门用于处理.docx格式的Word文档。它提供了更高级的API,可以读取、写入和修改.docx文件,并支持处理文本、样式、段落、表格、图像和其他文档元素。

  4. JWord:JWord是一个商业库,用于创建和操作Word文档。它提供了丰富的API和功能,可以生成复杂的Word文档,包括文本、样式、表格、图像、图表和其他元素。

  5. Aspose.Words for Java:Aspose.Words是一个商业库,用于在Java应用程序中处理Word文档。它提供了强大的API和功能,可以创建、修改、转换和打印Word文档,并支持许多高级特性,如合并文档、插入水印、执行邮件合并等

本文中,我们采用Apache POI来实现

3.2.引入Apache POI依赖

<dependency>
	<groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

3.3.获取表及表字段说明Mapper

定义实体类TableStruct接收我们需要的字段,例如,这里我们需要field、type、comment上字段
在这里插入图片描述

@Data
public class TableStruct {
	private String field;
	private String type;
	private String comment;
}

编写我们的SQL,这里我使用Mybatis,当然,其他的SQL框架也行

public interface TableMapper {

	@Select("SHOW TABLES")
    List<String> getAllTables();

    @Select("SHOW FULL FIELDS FROM ${tableName}")
    List<TableStruct> getTableInfo(@Param("tableName") String tableName);

}

3.4.POI创建文档表格,并填充数据

//设置标题
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);
}

// 创建文档
XWPFDocument document = new XWPFDocument();
            
 //设置标题
XWPFStyles styles = document.createStyles();
String heading1StyleId = "heading1";
addCustomHeadingStyle(styles, heading1StyleId, "标题 1", 1);

tableMapper.getAllTables().forEach(temp ->{
	//生成标题
	XWPFParagraph title1Paragraph = document.createParagraph();
    title1Paragraph.setStyle(heading1StyleId);
    XWPFRun title1Run = title1Paragraph.createRun();
    title1Run.setText(temp);
                
    //生成表头
    List<TableStruct> tableInfo = tableMapper.getTableInfo(temp);
	XWPFTable table = document.createTable(tableInfo.size() + 1, 4);
	table.setWidth("100%");
	table.getRow(0).getCell(0).setText("序号");
	table.getRow(0).getCell(1).setText("字段名称");
	table.getRow(0).getCell(2).setText("字段类型");
	table.getRow(0).getCell(3).setText("字段描述");
			    
	//生成表内容  第0行已经设置为表头,因此我们需要从第一行开始
	for (int row = 0; row < tableInfo.size(); row++) {
		table.getRow(row +1 ).getCell(0).setText(Integer.toString(row));
		table.getRow(row +1 ).getCell(1).setText(tableInfo.get(row).getField());
		table.getRow(row +1 ).getCell(2).setText(tableInfo.get(row).getType());
		table.getRow(row +1 ).getCell(3).setText(tableInfo.get(row).getComment());
	}
});

3.5.完整的接口下载代码

	@GetMapping("/info/download")
	public void downSeg(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);

			tableMapper.getAllTables().forEach(temp ->{
				//生成标题
				XWPFParagraph title1Paragraph = document.createParagraph();
                title1Paragraph.setStyle(heading1StyleId);
                XWPFRun title1Run = title1Paragraph.createRun();
                title1Run.setText(temp);
                
                //生成表头
                List<TableStruct> tableInfo = tableMapper.getTableInfo(temp);
			    XWPFTable table = document.createTable(tableInfo.size() + 1, 4);
			    table.setWidth("100%");
				table.getRow(0).getCell(0).setText("序号");
				table.getRow(0).getCell(1).setText("字段名称");
				table.getRow(0).getCell(2).setText("字段类型");
				table.getRow(0).getCell(3).setText("字段描述");
			    
				//生成表内容  第0行已经设置为表头,因此我们需要从第一行开始
				 for (int row = 0; row < tableInfo.size(); row++) {
					table.getRow(row +1 ).getCell(0).setText(Integer.toString(row));
					table.getRow(row +1 ).getCell(1).setText(tableInfo.get(row).getField());
					table.getRow(row +1 ).getCell(2).setText(tableInfo.get(row).getType());
					table.getRow(row +1 ).getCell(3).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);
    }

3.6.效果展示

浏览器访问该接口,即可下载
在这里插入图片描述
效果如下所示
在这里插入图片描述
OK,收拾东西,准备下班(2023年11月28日16:57:24),楼主单位4点50下班,从产生这个想法,到我这个想法实现,以及到我生成这个文档以后,将这50多张表的结构说明,补充到详细设计文档里面,总共花了大概2个小时。今天下午又是收货满满的一天。

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在PowerDesigner中,可以通过以下步骤为数据库添加注释: 1. 打开PowerDesigner,选择相应的数据建模项目。 2. 在左侧的"浏览器"窗格中,找到并展开你要添加注释数据库。 3. 右键点击该,在弹出的上下文菜单中选择"修改"。 4. 在"编辑器"窗口中,选择"注释"标签页。 5. 在注释文本框中输入你想要添加的注释信息。 6. 点击"应用"以保存注释。 7. 关闭"编辑器"窗口。 8. 最后,你可以导出数据库结构以便生成数据库设计文档。在PowerDesigner中,你可以使用一键导出功能来导出数据库结构和其他相关文档。 通过以上步骤,你可以在PowerDesigner中为数据库添加注释,并将数据库结构导出为数据库设计文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [PowerDesigner一键导出数据库设计结构](https://blog.csdn.net/wjg8209/article/details/114786319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [PowerDesigner显示数据库中文备注](https://download.csdn.net/download/u013769717/12815620)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值