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

文章目录

    • 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.mzph.cn/news/182265.shtml

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

相关文章

物联网开发(一)新版Onenet 基础配置

onenet新创建的账号&#xff0c;没有了多协议接入&#xff0c;只有新的物联网开放平台 第一讲&#xff0c;先给大家讲一下&#xff1a;新版Onenet 基础配置 创建产品 产品开发-->创建产品 产品的品类选择个&#xff1a;大致符合你项目的即可&#xff0c;没有影响 选择智…

watch函数与watchEffect函数

watach函数&#xff1a; 与vue2.x的配置功能一致 监视指定的一个或多个响应式数据, 一旦数据变化, 就自动执行监视回调 默认初始时不执行回调, 但可以通过配置immediate为true, 来指定初始时立即执行第一次 通过配置deep为true, 来指定深度监视 watchEffect函数&#xff1a;…

企业人力资源公司抖音直播招聘断播怎么处理?

企业人力资源公司抖音直播招聘断播怎么处理&#xff1f; 最直接的处理方式就是进行抖音直播招聘报白&#xff0c;报白后在直播和视频中发布招聘和企业信息&#xff0c;不用担心被封禁和限制流量。 可以通过抖音直播进行招聘&#xff0c;也可以在视频中添加小程序&#xff0c;…

【送书活动二期】Java和MySQL数据库中关于小数的保存问题

之前总结过一篇文章mysql数据库&#xff1a;decimal类型与decimal长度用法详解&#xff0c;主要是个人学习期间遇到的mysql中关于decimal字段的详解&#xff0c;最近在群里遇到一个小伙伴提出的问题&#xff0c;也有部分涉及&#xff0c;今天就再大致总结一下Java和MySQL数据库…

ChatGPT成了背锅侠:利用AI做蹭热点视频

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 在抖音\视频号上已经有很多人利用ChatGPT做热点视频的案例了&#xff0c;视频都是点赞大几千、几万。看完本文&#xff0c;你会略知一二&#xff0c;如下图所示&#xff1a; 这个视频&#xff0c…

Windows安装Docker、自定义安装目录

目录 前言一、Docker安装包下载二、自定义Docker安装路径、设置到其他盘三、安装Docker四、安装后配置1.修改镜像保存路径2.自定义镜像源&#xff08;可选&#xff09; 五、Docker运行验证1.docker/welcome-to-docker2.MySQL服务 总结 前言 Docker是一种开源的容器化平台&…

预付费远传水表好用还是后付费远传水表好用?

在远传水表市场中&#xff0c;预付费远传水表和后付费远传水表各自具有一定的优势和劣势。接下来&#xff0c;小编就来为大家讲下两者的优劣势&#xff0c;以此来判断到底是预付费远传水表好用还是后付费远传水表好用。 一、预付费远传水表 1.优点 (1)先付费后用水&#xff1a;…

Proteus的网络标号与总线

Proteus为了减少过多、复杂的连线&#xff0c;可以使用网络标号与总线配合使用。 Proteus的导线上添加了网络标号&#xff0c;意味着在Proteus上相同的网络标号是连在一起的&#xff0c;所说在图纸上看不出来。 如下图是比较好的Proteus中使用总线的绘制的图纸。可以效仿着画…

Echarts的引入使用

ECharts文档 1.下载并引入Echarts 2.准备一个具备大小的DOM容器 3.初始化echarts实例对象 4.指定配置项和数据(option) 5.将配置项设置给echarts实例对象 最后是一个js文件 echarts的引入 1.引入echarts - js 文件 <script src"js/echarts.min.js"></scri…

Git和Git小乌龟安装

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地进行从很小到非常大的项目的版本管理。它最初是由Linux Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git具有速度、…

国密加密工业路由器 数据安全升级

国密加密工业路由器&#xff0c;简称国密加密路由器&#xff0c;是指遵循“商用密码管理规范”中规定的国家商用密码算法&#xff0c;采用国密加密芯片和密码算法的专业路由器。相比-般路由器&#xff0c;国密加密路由器具有更高级别的加密保护&#xff0c;可以有效提高数据传输…

Python---练习:求某同学成绩的总分及平均分

需求&#xff1a; 已知某同学的语文(70)、数学(90) 、英语(80)、历史(75)、地理(85)五门课的成绩,编程求该同学的总分以及平均分。 思考&#xff1a; 要求是算总分和平均分&#xff0c;先看总分&#xff0c;已经知道了各科成绩&#xff0c;那么可以用把成绩赋值给每个学科的…

PAT-10道题

PAT算法刷题 1002 1002 一&#xff1a;对于每一的1到6都进行枚举&#xff0c;进行递归操作 二&#xff1a;如果位数到了指定的n的时候&#xff0c;递归的条件&#xff0c;进行判断是否可以整除操作 #include<iostream> #include<algorithm> using namespace std; l…

antd vue a-select 下拉框位置偏移

问题 下拉框未固定 原因 select下拉框的定位是根据body定位 解决方法 在select 标签中添加&#xff1a; :getPopupContainer"(triggerNode) > (triggerNode.parentElement)" :getPopupContainer"(triggerNode) > (triggerNode.parentElement)"…

1-2、计算机组成

语雀原文链接 文章目录 1、计算机组成1-1、主板1-2、接口卡1-3、存储器&#xff08;内存&#xff09; 2、存储器2-1、存储器的重要性2-2、物理存储器2-3、逻辑存储器2-4、内存地址空间的分段2-5、存储单元2-6、指令和数据 3、总线3-1、三类总线3-2、CPU读数据例子3-3、CPU写数…

spring本地事务与单/多线程

请直接看原文 原文链接:多线程与数据库事务以及数据库连接之间的关系 - 知乎 (zhihu.com) -------------------------------------------------------------------------------------------------------------------------------- 今天我们来梳理一下&#xff0c; 多线程、数…

【数据库】基于索引的扫描算法,不同类型索引下的选择与连接操作,不同的代价及优化

基于索引的算法 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定期更…

JDK8升级JDK11最全实践干货来了

1、前言 截至目前&#xff08;2023年&#xff09;&#xff0c;Java8发布至今已有9年&#xff0c;2018年9月25日&#xff0c;Oracle发布了Java11&#xff0c;这是Java8之后的首个LTS版本。那么从JDK8到JDK11&#xff0c;到底带来了哪些特性呢&#xff1f;值得我们升级吗&#x…

csapp-linklab之第二阶段“输出学号”实验报告

本阶段主题是链接中的“重定位”。两次重定位&#xff0c;一次是绝对地址重定位&#xff0c;一次是PC相对地址重定位。 本题目标依旧是输出学号&#xff0c;反汇编phase2.o&#xff0c;看到学号“0000000000”已经存放在只读数据区了。现在任务就是改do_pheas的指令和重定位表…

Ubuntu系统Springboot项目Nginx安装(编译安装方式)

1.下载 nginx官网下载 Index of /download/ 2.解压 这里我下载的1.25.3版本&#xff0c;系统是ubuntu 解压 tar -zxvf nginx-1.25.3.tar.gz 3.编译安装 安装前需要执行安装一些系统依赖 3.1安装PCRE库 ubuntu&#xff1a;执行以下命令 sudo apt-get install libpcre…