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

news2024/12/23 22:22:17

文章目录

    • 1.场景说明
    • 2.解决办法
    • 3.生成文档
      • 3.1.实现思路
      • 3.2.引入Apache POI依赖
      • 3.3.获取表及表字段说明Mapper
      • 3.4.POI创建文档表格,并填充数据
      • 3.5.完整的接口下载代码
      • 3.6.效果展示

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个小时。今天下午又是收货满满的一天。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1262892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

获得文件MD5——校验完整性 window 和 Linux下操作

目录 引出window下获得文件MD5Linux下获得文件MD5单个文件整个目录下所有文件检查MD5 总结 引出 1.Windows 10 自带了一个命令行程序 certutil可以 获取文件的 MD5 值&#xff1b; 2.Linux下md5sum命令获得文件MD5值&#xff1b; window下获得文件MD5 Windows 10 自带了一个命…

python中的简单线性拟合

简单线性回归可以拟合线性关系的数据&#xff0c;一般使用一次函数或二次函数即可。 import numpy as np import matplotlib.pyplot as pltxnp.array([1,2,3,4,5,6,7,8,9,10]) ynp.array([2.5,4.5,4.8,5.5,6.0,7.0,7.8,8.0,9.0,10.0])#一次拟合函数 slope,interceptnp.polyfit…

vs2019 - MFC对话框程序的工程名称不支持下划线命名法

文章目录 vs2019 - MFC对话框程序的工程名称不支持下划线命名法概述笔记备注END vs2019 - MFC对话框程序的工程名称不支持下划线命名法 概述 正在写账单分析程序, 用MFC 对话框. 因为比较习惯下划线命名法, 就在向导中给工程名称起了一个my_test这样的名称(下划线命名法, 小…

亮相史上规模最大高交会,Coremail展现邮件技术创新实力

11月19日&#xff0c;第二十五届中国国际高新技术成果交易会在深圳落下帷幕&#xff0c;作为国内邮件行业引领者&#xff0c;Coremail受邀参展。 展览现场&#xff0c;Coremail邮件解决方案及系列产品受到了众多参观者与业内人士的关注与好评。Coremail XT6邮件系统技术成熟&a…

iOS-打包上架构建版本一直不出现/正在处理/自动消失

iOS开发过程中&#xff0c;打包上架苹果审核是一个不可或缺的环节。说实话&#xff0c;这个问题我遇见两次了&#xff0c;为了让自己长点记性&#xff0c;决定写下来。首先&#xff0c;列举几种情况&#xff1a; 1.iPa包上传至App store后&#xff0c;一个小时内不显示构建版本…

使用Prometheus监控Synology(群辉)

1、简介 在现代的IT环境中&#xff0c;对于服务器和网络设备的监控是至关重要的。Synology&#xff08;群辉&#xff09;作为一种流行的网络存储解决方案&#xff0c;为用户提供了高性能和可靠的存储服务。然而&#xff0c;了解Synology设备的运行状况和性能指标对于确保其正常…

Nodejs+Vue校园餐厅外卖订餐点餐系统 PHP高校食堂 微信小程序_0u4hl 多商家

对于校园订餐小程序将是又一个传统管理到智能化信息管理的改革&#xff0c;对于传统的校园订餐管理&#xff0c;所包括的信息内容比较多&#xff0c;对于用户想要对这些数据进行管理维护需要花费很大的时间信息&#xff0c;而且对于数据的存储比较麻烦&#xff0c;想要查找某一…

为品质加冕 | 喜尔康智家再次斩获大奖

近日&#xff0c;被誉为“家居质量界奥斯卡”的2023年度沸腾质量奖颁奖盛典在福建厦门第三届家居质量大会同期隆重举行。现场重磅揭晓2023年沸腾质量奖测评获奖结果。 今年&#xff0c;喜尔康智能家居再接再厉&#xff0c;从数百家参评企业中脱颖而出&#xff0c;参评的智能坐便…

一起学docker系列之十三使用Dockerfile构建带有Java 8、Vim和Ifconfig功能的CentOS镜像

目录 1 前言2 构建流程3 Dockerfile说明4 解释Dockerfile5 构建Docker镜像6 运行Docker容器7 总结8 参考地址 1 前言 Docker是一个强大的工具&#xff0c;可以创建一致、可移植和隔离的环境。在本指南中&#xff0c;我们将介绍如何创建一个基于CentOS的Docker镜像&#xff0c;…

基于FPGA的五子棋游戏设计

基于FPGA的五子棋游戏设计 本文基于FPGA设计五子棋游戏&#xff0c;使用按键输入&#xff0c;使用VGA接口输出。五子棋的棋具与围棋相同&#xff0c;棋子分为黑白两色&#xff0c;棋盘为1010&#xff0c;棋子放置于棋盘线交叉点上。两人对局&#xff0c;各执一色&#xff0c;轮…

使用docker-compose优雅部署rocketMQ

使用docker-compose优雅部署RocketMQ 随着市场的发展&#xff0c;越来越多的复杂场景出现在我们日常的开发工作中。随之也越来越多的好的工具&#xff0c;也同步出现在程序员的学习范围清单内。好的工具提高产品性能的同时&#xff0c;也带来了很多安装上的问题&#xff0c;do…

31.0/LinkedList/Set/ashSet/ TreeSet/Map/ HashMap/ TreeMap

目录 31.1Linkedlist 31.2Set集合 31.3HashSet集合 31.4添加元素 31.5删除 31.6hashSet的遍历 31.7hashSet的源码 31.8TreeSet集合。 31.1Linkedlist 1.凡是查询源码 &#xff0c;我们都是从类的构造方法入手:/*** Constructs an empty list.*/public LinkedList() {}该…

figma 基础使用——准备阶段

1. 注册账号 2. figma有客户端也有网页端&#xff0c;使用注意同步字体 之后点击下载window installeer 字体 3. 安装 Figma汉化包 通过figma.cool 网站&#xff0c;下载离线的汉化包 之后通过谷歌的扩展程序添加

vulnhub靶机gigachad_vh

下载地址&#xff1a;Gigachad: 1 ~ VulnHub 主机发现 目标166 端口扫描 端口服务扫描 漏洞扫描 这玩意多得离谱 于是我用a重新扫了一遍 先去看web (⊙﹏⊙)离谱&#xff0c;目录扫描&#xff08;之前先去看一下nmap扫到的html&#xff09; 后面扫描的目录奇多&#xff0c;而…

C# 实现微信退款及对帐

目录 需求 基础准备 关键代码 操作界面 ​编辑 退款订单类及方法 退款功能实现 对帐 支付商家后台相关要点 实时交易帐单查询 精确交易帐单查询 小结 需求 在招聘报名系统里&#xff0c;考务费支付是其中一个环节&#xff0c;支付方式很多种&#xff0c;比如银联、…

救命,不会还有体制内姐妹不知道这个神器吧

体制内&#xff0c;每天各种写材料啊啊啊&#xff01;&#xff01;&#xff01;什么用词、结构、形式都要严谨&#xff0c; 有时候憋不出话来说&#xff0c;真的太难了&#xff0c;谁懂啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 这个好东西真的救我大…

软工2021上下午第六题(组合模式)

阅读下列说明和Java代码&#xff0c;将应填入&#xff08;n&#xff09;处的字句写在答题纸的对应栏内。 【说明】 层叠菜单是窗口风格的软件系统中经常采用的一种系统功能组织方式。层叠菜单中包含的可能是一个菜单项&#xff08;直接对应某个功能&#xff09;&#xff0c;也可…

大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)

本期文章&#xff0c;我们将通过三个动手实验从浅到深地解读和演示大语言模型&#xff08;LLMs&#xff09;&#xff0c;如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一&#xff1a;使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…

Unity3d 灯光阴影开启,法线贴图出现BUG

URP项目打开灯光的阴影后&#xff0c;法线贴图出现BUG 解决方案&#xff1a;按照下图所示调整材质的选项即可

通义千问 Qwen-7B-Chat-Int4 模型本地化部署

如需在本地或离线环境下运行本项目&#xff0c;需要首先将项目所需的模型下载至本地&#xff0c;通常开源 LLM 与 Embedding 模型可以从 HuggingFace 下载。 以本项目中默认使用的 LLM 模型 THUDM/ChatGLM2-6B 与 Embedding 模型 moka-ai/m3e-base 为例&#xff1a; 下载模型…