数据库表字段以表格形式写入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");
    }
}

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

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

相关文章

Redis的持久化操作

目录 一、Redis的持久化方式 1.RDB方式进行持久化 1.1 RDB的两种形式 &#xff08;a&#xff09;自动快照&#xff1a; &#xff08;b&#xff09;手动快照 1.2.RDB的特点 1.3.RDB的使用情况 2.AOF方式进行持久化 2.1 AOF持久化 2.2 AOF重写机制 3.RDB和AOF使用情景 R…

做一个Springboot文件上传-阿里云

概述 这个模块是用来上传头像以及文章封面的&#xff0c;图片的值是一个地址字符串&#xff0c;一般存放在本地或阿里云服务中 1、本地文件上传 我们将文件保存在一个本地的文件夹下&#xff0c;由于可能两个人上传不同图片但是却同名的图片&#xff0c;那么就会一个人的图片就…

C++模拟实现——红黑树

一、介绍 红黑树也是对一般的搜索二叉树不能保证平衡的一个改进&#xff0c;和AVL树采用的思路不同&#xff0c;但同样需要旋转&#xff0c;其本质也是一颗平衡搜索二叉树&#xff0c;其节点有颜色的区分&#xff0c;并且被一些规则束缚&#xff0c;在这些规则下&#xff0c;能…

从《lc42 接雨水》到《lc84 柱状图中的最大矩形》

1 LC42 接雨水 1.1 答案 解法四&#xff1a;双指针 动态规划中&#xff0c;我们常常可以对空间复杂度进行进一步的优化。 例如这道题中&#xff0c;可以看到&#xff0c;max_left [ i ] 和 max_right [ i ] 数组中的元素我们其实只用一次&#xff0c;然后就再也不会用到了。所…

Niushop单商户及多商户v5商城系统第三方商业插件cps联盟视频购物及多包装库存转换的安装

一、后端安装 把video文件夹直接上传到addon目录下即可登录后台&#xff0c;设置->系统维护->插件管理->未安装插件&#xff0c;找到插件直接安装即可 3.在营销->营销中心->营销活动&#xff0c;找到视频列表这个插件&#xff0c;点击进去配置视频即可 4.装…

13.(vue3.x+vite)组件间通信方式之provide与inject

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 依赖注入Provide / Inject 在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就…

社区论坛小程序源码系统,功能齐全,页面简洁,前端+后端+完整部署教程

现如今&#xff0c;社区论坛已经成为人们交流思想&#xff0c;分享经验&#xff0c;获取信息的重要平台。近年来&#xff0c;小程序的出现更是改变了传统的网站建设方式&#xff0c;让用户体验更加便捷&#xff0c;高效。今天源码小编来和大家分享一款社区论坛小程序源码系统&a…

最强大模型训练芯片H200发布!141G大内存,AI推理最高提升90%,还兼容H100

梦晨 克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 英伟达老黄&#xff0c;带着新一代GPU芯片H200再次炸场。 官网毫不客气就直说了&#xff0c;“世界最强GPU&#xff0c;专为AI和超算打造”。 听说所有AI公司都抱怨内存不够&#xff1f; 这回直接141GB大内存&#xff0c;与…

IDEA创建JavaFX项目

1、New -> Project 2、选择JavaFX 配置项目名&#xff0c;包名&#xff0c;lib包管理工具&#xff0c;JDK版本&#xff08;注&#xff0c;JDK版本最低需要11&#xff09; 3、选择lib包 根据自己需求选择 lib包介绍 BootstrapFX&#xff1a;BootstrapFX 是一个为 JavaFX 提…

mysql数据库超过最大连接数

mysql 超过数据库最大连接数解决办法 1、报错信息 首先无论是navicat 执行sql还是 用idea启动多的服务都会有如下报错信息&#xff1a; 2、解决办法 2.1命令方式修改 这种方法是由其他资料提供的。这种修改方式是临时的&#xff0c;如果mysql服务重启设置就会还原&#xff…

解决Python中使用requests库遇到的身份验证错误

在使用requests库进行HTTP请求时&#xff0c;用户遇到了一个AuthenticationRequired&#xff08;身份验证必须&#xff09;的错误。然而&#xff0c;当使用urllib.request.urlopen执行相同的操作时&#xff0c;却能够成功。同时&#xff0c;用户提供了自己的系统信息&#xff0…

Flink 整合 hudi

1、hudi介绍&#xff1a; Hudi 是一个开源的大数据存储和处理框架&#xff0c;通过提供数据表、写入、读取、更新和删除等功能&#xff0c;实现了高效的增量数据处理和数据管理。它广泛应用于大数据领域&#xff0c;为数据湖环境下的数据操作提供了强大的支持。不仅可以存储数…

D-阿强与网格

题目链接 : 阿强与网络 思路 : 数学模拟; 详情请看代码 : 代码 : #include<iostream> #include<algorithm> using namespace std; typedef long long LL; int main(){int t ; scanf("%d",&t);LL ans,m,n,x,y;while(t--){scanf("%lld%lld…

流量分析(5.5信息安全铁人三项赛数据赛题解)

黑客通过外部的web服务器攻击到企业内部的系统中&#xff0c;并留下了web后门&#xff0c;通过外部服务器对内部进行了攻击。 目录 黑客攻击的第一个受害主机的网卡IP地址 黑客对URL的哪一个参数实施了SQL注入 第一个受害主机网站数据库的表前缀(加上下划线 例如abc_) 第一…

win10资源管理器占用CPU过高导致卡顿

win10 打开几个文件夹后 资源管理器占用CPU 飙升&#xff0c;卡的很难受&#xff0c;网上找了几个办法 关闭 小娜&#xff0c;关闭搜索 什么的 都没明显改善&#xff0c;还有损招&#xff0c;重启资源管理器&#xff0c;重启一次 20多秒&#xff0c;要不了多长时间就会再次卡…

2023中国跨境电商出海成功品牌TOP5:跨境独立站

1 中国跨境电商出海最佳品牌 通过搭建跨境电商独立站&#xff0c;完善多渠道战略&#xff0c;并获取更多品牌自主权与更高利润率已是大势所趋。以下整理了外媒评选出的中国跨境电商出海最佳品牌&#xff08;指拥有“跨境电商独立站”并持有“自有品牌”的公司&#xff09;。本…

二维码智慧门牌管理系统升级解决方案:标准地址ID查询服务:高效、精准

文章目录 前言一、解决查询效率低下的问题二、提高信息精准度三、应用案例 前言 随着城市的发展和信息化步伐的加快&#xff0c;二维码智慧门牌管理系统已成为各大城市管理部门和企事业单位的必备工具。然而&#xff0c;实际应用中存在一些问题&#xff0c;如查询效率低下、信…

Sql Prompt 10下载安装图文教程

在操作过程中&#xff0c;请暂时关闭你的防病毒软件&#xff0c;以免其误报导致操作失败。 资源 SQL Prompt 10 https://www.aliyundrive.com/s/QuMWkvE1Sv6 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&…

web基础和http协议(粗糙版)

服务部署&#xff0c;集训&#xff0c;分布式&#xff0c;数据库&#xff0c;日志系统&#xff0c;等二阶段 web基础和http协议&#xff1a; web的相关基础知识&#xff0c;包括域名 dns解析 网页的概念以及http协议 1.网络当中通信&#xff1a;端口 ip 协议 tcp/ip 传输过程…

CPS-8910

PCI Express&#xff0c;有线开关设备 CPS-8910专为在PXI平台或软件无线电设备上实现大型多输入多输出(MIMO)扩展配置和系统控制而设计。 CPS-8910提供了2个PCI Express上行端口和8个下行端口来实现无缝系统扩展。 下行端口可以连接软件无线电可重配置设备等外部设备&#xff0…