利用数据库的表,生成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.mfbz.cn/a/201502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kong处理web服务跨域

前言 好久没写文章了&#xff0c;大概有半年多了&#xff0c;这半年故事太多&#xff0c;本文写不下&#xff0c;就写写文章标题问题&#xff01; 问题描述 关于跨域的本质问题我这里不过多介绍&#xff0c;详细请看历史文章 跨域产生的原因以及常见的解决方案。 我这边是新…

连锁零售企业如何提高异地组网的稳定性?

随着数字化时代的到来&#xff0c;连锁零售企业面临着日益复杂和多样化的网络挑战。连锁零售企业是在不同地理位置拥有分支机构和零售店&#xff0c;可能同城或异地&#xff0c;需要确保各个地点之间的网络连接稳定和可靠。但由于不同地区的网络基础设施差异、网络延迟和带宽限…

【 C 语言经典100例】C 练习实例10

题目&#xff1a;打印楼梯&#xff0c;同时在楼梯上方打印两个笑脸。 程序分析&#xff1a;用 ASCII 1 来输出笑脸&#xff1b;用i控制行&#xff0c;j来控制列&#xff0c;j根据i的变化来控制输出黑方格的个数。 #include<stdio.h>int main() {int i,j;printf("\…

浙江省跨境电商产业联盟大会成功举办:开启探索数字贸易丝路电商之旅

11月26日上午&#xff0c;浙江省跨境电商产业联盟大会在杭州国际博览中心“丝路电商馆”成功举办。浙江省商务厅副厅长张钱江出席活动并致辞。39个省级跨境电商产业园代表&#xff0c;知名跨境电商平台、卖家、服务商企业代表、高校智库专家等参加本次活动&#xff0c;吸引大批…

基于PaddleOCR银行卡识别实现(三)

前言 基于PaddleOCR银行卡识别实现&#xff08;一&#xff09; 基于PaddleOCR银行卡识别实现&#xff08;二&#xff09; 前两篇文章讲了检测模型和识别模型的实现&#xff0c;这一篇文章姗姗来迟&#xff0c;将讲解下两个模型的串联应用和PaddleOCR的源码精简&#xff0c;下面…

全局异常处理类

全局异常处理类 创建步骤 定义一个自己的全局错误处理类GlobalExceptionHandler创建一个ExceptionHandler类&#xff0c;主要是用ControllerAdvice和 ExceptionHandler处理错误信息 以下说明各个注解的作用&#xff1a; ControllerAdvice(annotations {RestController.class…

【爬虫实战】最新python豆瓣热榜Top250

一.最终效果 豆瓣是大多数新手练习爬虫的 二.数据定位过程 对于一个目标网站&#xff0c;该如何快速判定页面上的数据来源&#xff1f;首先你需要简单web调试能力&#xff0c;对大多数开发者来说都chrome浏览器应该是不二选择&#xff0c;当然我选中的也是。F12打开调试面板&…

在PyCharm中配置PyQt5环境

在PyCharm中配置PyQt5环境 文章目录 1.安装第三方库2.PyQt5设计器3.PyUIC转换工具 &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1…

《On Java》

文章目录 一、Java概述1.JVM、JRE和JDK的关系2.什么是Java程序的主类3.Java和C的区别 三、面向对象3.1 面向对象三大特性封装继承多态 3.2 基本类型默认值3.3 和 equals 四、操作符4.1 比特和字节4.2 位操作&^ 4.3 运算符Math.round()loat f3.4;是否正确 4.4 实战小于n的最…

外包干了5个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

【刷题】DFS

DFS 递归&#xff1a; 1.判断是否失败终止 2.判断是否成功终止&#xff0c;如果成功的&#xff0c;记录一个成果 3.遍历各种选择&#xff0c;在这部分可以进行剪枝 4.在每种情况下进行DFS&#xff0c;并进行回退。 199. 二叉树的右视图 给定一个二叉树的 根节点 root&#x…

DDoS高防IP到底是什么?

DDoS高防IP是提供一个带防御的IP&#xff0c;主要是针对网络中的DDoS攻击进行保护&#xff0c;是针对互联网服务器遭受大流量的DDoS攻击后&#xff0c;导致服务不可用的情况下&#xff0c;用户可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP上&#xff0c;从而确保源站…

【浅尝C++】运算符重载(含类的3大默认成员函数:赋值、取地址、const对象取地址运算符重载)

&#x1f388;归属专栏&#xff1a;浅尝C &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;在Linux与C中来回横跳&#xff0c;哪个学累了&#xff0c;就去学另外一个~~ 文章前言&#xff1a;本篇文章简要介绍C的运算符重载&#xff0c;同时接着…

如何用CHAT写“科技探索者”视频号运营方案

问CHAT&#xff1a;生成一篇“科技探索者”视频号运营方案&#xff0c;要求内容&#xff1a; &#xff08;1&#xff09;视频号的定位、面向的人群、主要发布哪方面的内容 &#xff08;2&#xff09;视频号的内容设计&#xff08;用什么样的方式来体现、最好有内容创意&#xf…

Java大型智慧工地APP云平台源码带AI智能识别功能

智慧工地为建筑全生命周期赋能&#xff0c;用创新的可视化与智能化方法&#xff0c;降低成本&#xff0c;创造价值。 一、智慧工地APP概述 智慧工地”立足于互联网&#xff0c;采用云计算&#xff0c;大数据和物联网等技术手段&#xff0c;针对当前建筑行业的特点&#xff0c;…

Spark local模式的安装部署

安装与配置Spark开发环境。 相关知识 Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架&#xff0c;Spark拥有Hadoop MapReduce所具有的优点&#xff1b;但…

Linux 进程(二)

1.当前工作目录 Linux 下使用 ls /proc 查看程序中的进程&#xff0c;其中这些蓝色的数字代表的就是进程。 其中cwd(current working directory)就是当前工作目录&#xff0c;那么为什么cwd 和 exe 是在同一级目录下呢因为 进程需要依赖可执行程序&#xff0c;可执行程序需要依…

Reactor模式

Reactor模式有点类似事件驱动模式。在事件驱动模式中&#xff0c;当有事件触发时&#xff0c;事件源会将事件分发到Handler&#xff08;处理器&#xff09;&#xff0c;由Handler负责事件处理。Reactor模式中的反应器角色类似于事件驱动 模式中的事件分发器&#xff08;Dispatc…

操作系统原理-作业一-进程同步

1.某理发店可同时供 10 人理发&#xff0c;当店中顾客少于 10 人时&#xff0c;则店外的顾客可立即进入&#xff0c;否则需在外面等待。请定义所需信号量并写出信号量各种取值( 大于 0 、等于 0 、小于0)分别代表的含义&#xff0c;并用 P 、 V 操作编程实现完成多个顾…

HCIP---MPLS---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 MPLS协议使用标签交换来转发报文&#xff0c;最初是为了提高IP报文转发效率而设计的&#xff0c;但是后来随着硬件性能的提升&#xff0c;路由表已经不再是路由表/防火墙的转发瓶颈&#…
最新文章