数据库表字段以表格形式写入Word

在项目的开发中,难免会有编写概要设计、详细设计文档的要求,而在这些文档中,不可避免的就是要把数据库表的字段信息以表格的形式体现出来。例如下面这种格式

表数量少点还可以一点点粘贴,多了的话真的会疯,所以自己编写了一套可以自动读取数据表字段来批量写入文档的代码。

maven项目需要先引入依赖

        <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>27.0-hbase</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version> <!-- 请检查是否有更新的版本 --></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version> <!-- 请检查是否有更新的版本 --></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>25.1-jre</version></dependency>

代码如下: 

import avro.shaded.com.google.common.collect.Lists;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;import java.sql.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.List;public class DatabaseToWordExample{public static void main(String[] args) throws SQLException, IOException {// 创建Word文档XWPFDocument doc = new XWPFDocument();// 创建1级标题setDocTitle(doc,1,"一、数据库表设计");// 连接数据库Connection conn = DriverManager.getConnection("jdbc:mysql://{IP}:{port}/{数据库名}", 用户名, 密码);List<String> dbList = Lists.newArrayList("user");// 获取元数据DatabaseMetaData metaData = conn.getMetaData();int dbNum = 1;for (String database : dbList) {// 2级数据库标题名String databaseTitle = new StringBuilder(String.format("%d.%d",1,dbNum)).append(" ").append(database).append("库").toString();// 创建2级标题setDocTitle(doc,2,databaseTitle);int tableNum = 1;// 查询表列表ResultSet tables = metaData.getTables(database, null, null, null);while (tables.next()){String tableName = tables.getString("TABLE_NAME");// 查询表注释String sql = "SELECT table_comment FROM information_schema.tables WHERE table_schema = ? AND table_name = ?";PreparedStatement ps = conn.prepareStatement(sql);ps.setString(1, database);ps.setString(2, tableName);ResultSet rs = ps.executeQuery();String tableComment = "";if (rs.next()) {tableComment = rs.getString("table_comment");}// 3级表标题名String tableTitle = new StringBuilder(String.format("%d.%d.%d",1,dbNum,tableNum)).append(" ").append(tableName).append(" ").append(tableComment).toString();// 创建3级标题setDocTitle(doc,3,tableTitle);// 创建表格XWPFTable table = createTable(doc);ResultSet columns = metaData.getColumns(database, null, tableName, null);// 添加数据行while (columns.next()) {XWPFTableRow dataRow = table.createRow();setRowHeight(dataRow, "490");dataRow.getCell(0).setText(columns.getString("COLUMN_NAME"));dataRow.getCell(1).setText(columns.getString("TYPE_NAME"));dataRow.getCell(2).setText(Integer.toString(columns.getInt("COLUMN_SIZE")));dataRow.getCell(3).setText(columns.getString("REMARKS"));// 设置数据行单元格边框for (XWPFTableCell cell : dataRow.getTableCells()) {setCellBorders(cell);}}tableNum++;}dbNum++;}// 保存Word文档try (FileOutputStream out = new FileOutputStream("output.docx")) {doc.write(out);}// 关闭数据库连接conn.close();}/*** 设置标题** @param doc* @param titleLevel 标题等级* @param titleName 标题名称*/private static void setDocTitle(XWPFDocument doc, int titleLevel, String titleName){switch (titleLevel) {case 1:// 创建一级标题XWPFParagraph title1 = doc.createParagraph();XWPFRun run1 = title1.createRun();run1.setText(titleName);run1.setBold(true);run1.setFontSize(16);break;case 2:// 创建二级标题XWPFParagraph title2 = doc.createParagraph();XWPFRun run2 = title2.createRun();run2.setText(titleName);run2.setBold(true);run2.setFontSize(14);break;case 3:// 创建三级标题XWPFParagraph title3 = doc.createParagraph();XWPFRun run3 = title3.createRun();run3.setText(titleName);run3.setBold(true);run3.setFontSize(12);break;default:break;}}/*** 创建表格** @param doc* @return*/private static XWPFTable createTable(XWPFDocument doc){// 创建表格XWPFTable table = doc.createTable();// 设置表格宽度table.setWidth("9990");// 创建表头XWPFTableRow headerRow = table.getRow(0);setRowHeight(headerRow, "490");  // 设置行高headerRow.getCell(0).setText("字段名");headerRow.addNewTableCell().setText("字段类型");headerRow.addNewTableCell().setText("字段长度");headerRow.addNewTableCell().setText("字段备注");// 计算每个单元格的宽度int totalWidth = 8222;  // 总宽度,例如14.5厘米int numColumns = 4;  // 列数,例如4列int cellWidth = totalWidth / numColumns;  // 计算每个单元格的宽度// 设置表格的列宽CTTblWidth tblWidth = table.getCTTbl().addNewTblPr().addNewTblW();tblWidth.setType(STTblWidth.DXA);tblWidth.setW(BigInteger.valueOf(totalWidth));// 设置单元格的宽度for (XWPFTableRow row : table.getRows()) {for (XWPFTableCell cell : row.getTableCells()) {CTTcPr tcPr = cell.getCTTc().addNewTcPr();CTTblWidth cellWidth1 = tcPr.addNewTcW();cellWidth1.setW(BigInteger.valueOf(cellWidth));cellWidth1.setType(STTblWidth.DXA);}}// 设置表头单元格边框for (XWPFTableCell cell : headerRow.getTableCells()) {setCellBorders(cell);cell.setColor("D3D3D3");  // 浅灰色的十六进制颜色代码// 设置文字竖向居中cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);}return table;}private static void setRowHeight(XWPFTableRow row, String height) {row.setHeight(Integer.parseInt(height));}/*** 设置单元格边框和竖向居中* @param cell*/private static void setCellBorders(XWPFTableCell cell) {// 确保单元格的CTTcPr对象已经被初始化if (!cell.getCTTc().isSetTcPr()) {cell.getCTTc().addNewTcPr();}// 设置文字竖向居中cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);// 设置单元格上边框CTTcBorders borders = cell.getCTTc().getTcPr().addNewTcBorders();CTBorder topBorder = borders.addNewTop();topBorder.setVal(STBorder.SINGLE);topBorder.setSz(BigInteger.valueOf(4));topBorder.setColor("000000");// 设置单元格下边框CTBorder bottomBorder = borders.addNewBottom();bottomBorder.setVal(STBorder.SINGLE);bottomBorder.setSz(BigInteger.valueOf(4));bottomBorder.setColor("000000");// 设置单元格左边框CTBorder leftBorder = borders.addNewLeft();leftBorder.setVal(STBorder.SINGLE);leftBorder.setSz(BigInteger.valueOf(4));leftBorder.setColor("000000");// 设置单元格右边框CTBorder rightBorder = borders.addNewRight();rightBorder.setVal(STBorder.SINGLE);rightBorder.setSz(BigInteger.valueOf(4));rightBorder.setColor("000000");}
}

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

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

相关文章

如何在Linux上搭建本地Docker Registry并实现远程连接

Linux 本地 Docker Registry本地镜像仓库远程连接 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)镜像,不受本地局域网限制&#xff01; 1. 部署Docker Registry 使用官网安装方式,docker命令一键启动,该命令启动一个regis…

YARN,ZOOKEERPER--学习笔记

1&#xff0c;YARN组件 1.1YARN简介 YARN表示分布式资源调度&#xff0c;简单地说&#xff0c;就是&#xff1a;以分布式技术完成资源的合理分配&#xff0c;让MapReduce能高效完成计算任务。 YARN是Hadoop核心组件之一&#xff0c;用于提供分布式资源调度服务。 而在Hadoop …

Linux:安装软件的两种方式rpm和yum

一、rpm方式 1、简单介绍 RPM是RedHat Package Manager的缩写&#xff0c;它是Linux上打包和安装的工具。通过rpm打包的文件扩展名是.RPM。这个安装包就类似Windows系统中的.exe文件。rpm工具实现Linux上软件的离线安装。 2、软件相关信息的查询命令 查询Linux系统上所有已…

网站被攻击怎么办

随着互联网的普及和网络攻击的日益增多&#xff0c;网站安全成为了众多企业和个人必须面对的重要问题。为了保护网站和用户数据的安全&#xff0c;内容分发网络&#xff08;CDN&#xff09;成为了一种有效的解决方案。本文将介绍CDN在保护网站安全、抵御网络攻击方面的作用和应…

uniapp-轮播图点击预览功能

实现效果 点击后打开预览图 实现代码 <swiper v-if"this.bannerList.length > 1" class"swiper" autoplay"true" duration"500" interval"2000" change"changeSwiper"><swiper-item class"swip…

Python爬虫进阶:提升爬虫效率

文章目录 一、单线程多任务异步协程二、线程池requests模块三、两个方法提升爬虫效率总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试…

利用SD存储介质扩展MAXQ20000的非易失性数据存储空间

SD存储卡是一种可移动存储介质&#xff0c;通常用于相机、手机、平板电脑等设备中存储照片、视频、音乐等数据。SD存储卡的全称为Secure Digital Memory Card&#xff0c;是由SD Card Association制定的一种标准格式。它具有体积小、存储容量大、读写速度快、价格低廉等优点。目…

Linux CentOS7 添加网卡

一台主机中安装多块网卡&#xff0c;有许多优势。可以实现多项功能。 为了学习网卡参数的设置&#xff0c;可以为主机添加多块网卡。与添加磁盘一样&#xff0c;要在VMware中设置。利用图形化方式或命令行查看或设置网卡。本文仅初步讨论添加、查看与删除网卡&#xff0c;有关…

AtCoder Beginner Contest 329 题解A~F

A - Spread 输入字符串&#xff0c;字符之间加上空格输出 B - Next 输出数组当中第二大的数 C - Count xxx 统计每个字符出现过的最长长度&#xff0c;再累加即可 #include<bits/stdc.h> #pragma GCC optimize("Ofast") #define INF 0x3f3f3f3f #define I…

【网络奇遇记】那年我与计算机网络的浅相知

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 计算机网络的定义1.1 计算机早期的一个最简单的定义1.2 现阶段计算机网络的一个较好的定义 二. …

ExoPlayer架构详解与源码分析(8)——Loader

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

Redis数据的持久化

Redis的持久化有两种方式&#xff1a; RDB&#xff08;Redis Database&#xff09;和AOF&#xff08;Append Only File&#xff09; 目录 一、RDB 保存方式 2、rdb在redis.conf文件中的配置 二、AOF 1、保存方式 2、aof方式持久化在redis.conf文件中的配置 三、持久化建…

Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢&#xff1f; 1.2 什么是输入设备的应用编程&#xff1f; 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件&#xff1a; 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

rabbitMQ的扇出模式(fanout发布订阅)的生产者与消费者使用案例

扇出模式 fanout 发布订阅模式 生产者 生产者发送消息到交换机&#xff08;logs&#xff09;,控制台输入消息作为生产者的消息发送 package com.esint.rabbitmq.work03;import com.esint.rabbitmq.RabbitMQUtils; import com.rabbitmq.client.Channel;import java.util.Scanne…

java--俄罗斯方块

一、先看一下游戏运行时的画面 二、代码部分 1. Cell.java Cell.java&#xff1a; package demo1;import java.awt.image.BufferedImage; import java.util.Objects;/* 编写小方块类属性&#xff1a;行、列、每个小方格的图片方法&#xff1a;左移一格、右移一格、下落一格 编…

kubectl 本地远程链接k8s多个集群,远程管控多集群,查看日志 部署服务(windows版)

文章目录 一、前言二、windows上安装kubectl和mobaxterm2.1 准备安装包2.2 安装kubectl2.3 链接k8s集群2.4 查看某一个pod的容器日志2.5 切换context 上下文配置&#xff0c;实现在多个k8s集群间动态切换 一、前言 现如今是一个万物皆上云 的时代&#xff0c;各种云层出不穷&am…

贝锐蒲公英路由器X4C如何远程访问NAS?

在目前网盘前路坎坷的情况下&#xff0c;私人云盘已然是一种新的趋势&#xff01;那自己打造一个私有云盘&#xff0c;是否需要高成本或是高门槛呢&#xff1f;其实并不用&#xff01;蒲公英针对个人玩家打造了全方位的私有云解决方案。 &#xff08;1&#xff09;入门级玩家只…

Web之HTML笔记

Web之HTML、CSS、JS Web标准一、HTML&#xff08;超文本标记语言&#xff09;HTML 基本结构标签常用标签1.font标签2.p标签3.注释4.h系列标题5.img6.超链接a7.列表8.表格9.表单 Web之CSS笔记 Web之JavaScript(jQuery)笔记 Web标准 结构标准用于对网页元素进行整理和分类(HTML…

Git-概念与架构

GIT-概念与架构 一、背景和起源二、版本控制系统1.版本控制分类1.1 集中式版本控制1.2 分布式版本控制 2.Git和SVN对比2.1 SVN2.2 GIT 三、GIT框架1.工作区&#xff08;working directory&#xff09;2.暂存区&#xff08;staging area&#xff09;3.本地仓库&#xff08;local…