java 代码 导出表结构生成doc文档(支持MySQL,Oracle)

2023-10-29

1.导入依赖

<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.1.7</version>
</dependency>
<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext-rtf</artifactId>
    <version>2.1.7</version>
</dependency>

2.实现代码

package com.example.exceldemo;

import com.lowagie.text.*;
import com.lowagie.text.Font;
import com.lowagie.text.Rectangle;
import com.lowagie.text.rtf.RtfWriter2;
import com.lowagie.text.rtf.style.RtfParagraphStyle;

import java.awt.*;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.List;

/**
 * @Description:
 * @Author:clj
 * @CreateDate:2020/6/28 14:41
 */
public class CreateTableWord {

    public static void main(String[] args){
        String driver = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbc:oracle:thin:@127.0.0.1:1521/ORCL";
        String user = "root";
        String pwd = "root";
        createWord(driver, url, user, pwd);
    }

    private static void createWord(String driver, String url, String user, String pwd){
        //创建一个word文档,等待填写内容
        Document document = new Document(PageSize.A4);
        try {
            //内容填写完,输出文件
            RtfWriter2.getInstance(document, new FileOutputStream(
                    "D:/Tables-posp.doc"));
            //打开 doc
            document.open();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        List<String[]> tables = getTableNames(driver, url, user, pwd);
        //循环遍历输出所有的表的信息
        for (String[] tableInfo : tables) {
            List<Object[]> list = getTableColumns(driver, url, user, pwd, tableInfo[0]);
            document=docAll(document, tableInfo, list);
            System.out.println(tableInfo[0]);
        }
        System.out.println("总数量:"+tables.size());
        //关闭 doc
        document.close();
    }

    /**
     * 获取指定库中表名和表注释
     * @param driver
     * @param url
     * @param user
     * @param pwd
     * @return
     */
    public static List<String[]> getTableNames(String driver, String url, String user, String pwd){
        Connection conn = null;
        DatabaseMetaData dbmd = null;
        List<String[]> tableNames = new ArrayList<>();
        try {
            conn = getConnections(driver, url, user, pwd);
            dbmd = conn.getMetaData();
            //Oracle的写法
            ResultSet resultSet = dbmd.getTables(null, getSchema(conn), "%", new String[]{"TABLE"});
            //MySQL和PostgresSQL的写法
//            ResultSet resultSet = dbmd.getTables(null, "%", "%", new String[]{"TABLE"});
            while (resultSet.next()) {
                String[] tableInfo = new String[2];
                //表名
                String tableName = resultSet.getString("TABLE_NAME");
                tableInfo[0] = tableName;
                //表注释
                String tableRemark = resultSet.getString("REMARKS");
                tableInfo[1] = tableRemark;
                tableNames.add(tableInfo);
            }
        }catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return tableNames;
    }

    /**
     * 获取指定表的字段信息(包括字段名称,字段类型,字段长度,备注)
     * @param driver
     * @param url
     * @param user
     * @param pwd
     * @param tableName
     * @return
     */
    public static List<Object[]>  getTableColumns(String driver, String url, String user, String pwd, String tableName){
        List<Object[]> result = new ArrayList();
        Connection conn = null;
        DatabaseMetaData dbmd = null;
        try {
            conn = getConnections(driver,url,user,pwd);
            dbmd = conn.getMetaData();
            ResultSet rs = conn.getMetaData().getColumns(null, "%",tableName, "%");
            while(rs.next()){
                Object[] objects = new Object[4];
                //字段名称
                String colName = rs.getString("COLUMN_NAME");
                objects[0] = colName;
                //字段类型
                String dbType = rs.getString("TYPE_NAME");
                objects[1] = dbType;
                //字段长度
                int columnSize = rs.getInt("COLUMN_SIZE");
                objects[2] = columnSize;
                //备注
                String remarks = rs.getString("REMARKS");
                if(remarks == null || remarks.equals("")){
                    remarks = "";
                }
                objects[3] = remarks;
                result.add(objects);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    //获取连接
    public static Connection getConnections(String driver,String url,String user,String pwd) throws Exception {
        Connection conn = null;
        try {
            Properties props = new Properties();
            props.put("remarksReporting", "true");
            props.put("user", user);
            props.put("password", pwd);
            //MySQL的要加上下面的配置
//            props.setProperty("remarks", "true"); //设置可以获取remarks信息
//            props.setProperty("useInformationSchema", "true");//设置可以获取tables remarks信息
            Class.forName(driver);
            conn = DriverManager.getConnection(url, props);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        return conn;
    }

    //其他数据库不需要这个方法 oracle和db2需要
    public static String getSchema(Connection conn) throws Exception {
        String schema;
        schema = conn.getMetaData().getUserName();
        if ((schema == null) || (schema.length() == 0)) {
            throw new Exception("ORACLE数据库模式不允许为空");
        }
        return schema.toUpperCase().toString();
    }

    /**
     * 输出数据库中所有表的信息
     * @param document  document
     * @param tableInfo   表名和表注释
     * @param list      查询出该表中的信息
     * @return
     */
    public static Document docAll(Document document,String[] tableInfo, List<Object[]> list) {
        try {
            Paragraph ph = new Paragraph();
            Font font = new Font();
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(tableInfo[0].toLowerCase());
            if (tableInfo[1] != null && !"".equals(tableInfo[1])){
                stringBuilder.append("(" + tableInfo[1] + ")");
            }
            Paragraph paragraph = new Paragraph(stringBuilder.toString(), RtfParagraphStyle.STYLE_HEADING_1);
            paragraph.setAlignment(0);
            document.add(paragraph);
            Table table = new Table(4);
            table.setWidth(100);
            table.setBorderWidth(Rectangle.NO_BORDER);
            table.setPadding(0);
            table.setSpacing(0);

            Cell cell = null;
            cell = new Cell("字段名称");
            cell.setBackgroundColor(Color.LIGHT_GRAY);
            cell.setHeader(true);
            table.addCell(cell);
            cell = new Cell("字段类型");
            cell.setBackgroundColor(Color.LIGHT_GRAY);
            cell.setHeader(true);
            table.addCell(cell);
            cell = new Cell("字段长度");
            cell.setBackgroundColor(Color.LIGHT_GRAY);
            cell.setHeader(true);
            table.addCell(cell);
            cell = new Cell("备注");
            cell.setBackgroundColor(Color.LIGHT_GRAY);
            cell.setHeader(true);
            table.addCell(cell);

            for (int i = 0; i < list.size(); i++) {
                cell = new Cell(list.get(i)[0].toString().toLowerCase());
                cell.setUseAscender(true);
                cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
                table.addCell(cell);

                cell = new Cell(list.get(i)[1].toString().toLowerCase());
                cell.setUseAscender(true);
                cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
                table.addCell(cell);

                cell = new Cell(list.get(i)[2].toString());
                cell.setUseAscender(true);
                cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
                table.addCell(cell);

                cell = new Cell(list.get(i)[3].toString());
                cell.setUseAscender(true);
                cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
                table.addCell(cell);
            }
            document.add(table);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return document;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 代码 导出表结构生成doc文档(支持MySQL,Oracle) 的相关文章

  • 简单的Java程序插入USB热点后速度慢100倍

    我有以下Java程序 class Main public static void main String args throws java io IOException long start System nanoTime java io
  • 如何注册 org.springframework.integration.monitor.IntegrationMBeanExporter

    根据http www ibm com support knowledgecenter en SS7K4U 8 5 5 com ibm websphere nd multiplatform doc ae cspr data access tr
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 字符串 a == 字符串 b 的规则 [重复]

    这个问题在这里已经有答案了 我试图了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是什么 例如这个片段 public static void main String hi String s1 lol String s2 lol S
  • Hibernate更新查询问题

    对于此更新查询 update TestDB dbo MyEmp set empname where empid 我在 DAO 课上写的 MyEmployee myEmployee new MyEmployee MyEmployee myEm
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • 基于磁盘的 HashMap [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 是否有 或者是否有可用的库 允许我拥有基于磁盘的 HashMap 它不需要是原子的或任何东西
  • 相对重力

    我最近开始使用jMonkey引擎 这非常好 但我在尝试实现相对重力时陷入了困境 我想让行星彼此围绕轨道运行 不一定是完美的圆形轨道 取决于速度 所以每个对象都应该影响其他对象 我现在拥有的 关闭全球重力 bulletAppState get
  • 在 apex 中根据 2 种不同类型的用户进行自定义身份验证

    我有一种身份验证方案 目前仅验证用户是否在一个表中 即雇主表中 现在我希望这个身份验证方案来验证用户是雇主还是雇员 并且根据他们是雇主还是雇员 它应该将他们重定向到不同的页面 首先 我如何在身份验证脚本中包含第二个表 我最大的问题是 当员工
  • java springrabbit - 优雅地拒绝消息

    我有以下侦听器方法 Override public void onMessage Message message Channel channel try do something bad catch Exception e try long
  • 如何在不冒 StackOverflowError 风险的情况下使用 CompletableFuture?

    我想遍历异步函数的搜索空间 我将逻辑编码如下 Assuming that a function maps a range of inputs to the same output value minimizes the input valu
  • 是否可以使用 LOAD DATA INFILE 类型命令来更新数据库中的行?

    伪表 primary key first name last name date of birth 1 John Smith 07 04 1982 眼下名包含多行的用户全名 期望的结果是分割数据 因此first name包含 John la
  • Spring Boot 中的服务限流能力

    有什么办法可以实现Spring中其余服务的服务限制能力 特别是Spring boot 这里的期望是 我的服务暴露于外界 目前每秒 分钟的服务调用数量没有限制 我们希望通过设置限制来控制这一点 我有一个替代选项 通过跟踪并发哈希映射或任何缓存
  • Java无损保存原始JPEG

    如下所示 我有第一张图像是原始 JPEG 图像 第二张图像用于缓冲图像 然后使用保存http www lac inpe br JIPCookbook 6040 howto compressimages jsp http www lac in
  • mysql 中的 max(长度(字段))

    如果我说 select max length Name from my table 我得到的结果是 18 但我也想要相关数据 所以如果我说 select max length Name Name from my table 这是行不通的 我
  • 使用 SimpleDateFormat、Java 进行错误的日期解析

    我需要使用日期模式 yyyy MM dd 解析输入字符串中的日期 如果日期采用任何其他格式 则抛出错误 这是我解析日期的代码 private void validateDate throws MyException Date parsedD
  • Java 中有类似 .NET 的 NotImplementedException 的东西吗?

    有没有类似 NET 的东西NotImplementedException在Java中 康芒斯朗 http commons apache org proper commons lang javadocs api 2 6 org apache
  • 不鼓励在Web应用程序中使用线程吗?

    我们与同事就在 Java 的 Web 应用程序中使用线程进行了激烈的讨论 他们的观点是 不建议在 Java Web 应用程序中使用线程 因为它们不受容器管理 一般来说 我对此表示同意 因为线程可能会干扰容器 但是 如果它不是 Java EE
  • CreateProcess error=206,运行 gwtCompile 时文件名或扩展名太长

    我的应用程序是一个 springboot gradle 应用程序 我的应用程序的一部分涉及使用 gradle 进行遗留 gwt 编译 它工作正常 但今天当我运行下面的 gradle 任务时 它显示 CreateProcess error 2
  • 与手动搜索列表相比,Collections.binarySearch 的性能如何?

    我想知道该使用哪一个 我有一份学生名单 我想用他的名字搜索一个学生 到目前为止 我是通过迭代列表手动完成的 如下所示 for int i 0 i lt list size i Student student list get i if st

随机推荐

  • win10环境变量设置

    在装一些软件的时候 经常需要设置环境变量 但win10与win7有一些不同 1 打开文件资源管理器 2 最左边一列有 此电脑 点击 3 界面最上面一列会有 属性 点击 4 左边 高级系统设置 点击 5 环境变量 点击 有一个注意的地方是一般
  • VBA解析JSON

    前言 vba作为一种古老的语言 是不能直接处理json数据的 但是好在可以加载其他语言的执行引擎 间接的达到解析JSON的目的 示例代码 Public Function JsonParse jsonStr As String As Obje
  • 三输入或门(发现这个玩意很不好耍,编程出现错误,不知道哪里出现的,一不小心2输成3也无法查证)...

    1 timescale 1ns 1ps 2 module or3 3 x1 4 x2 5 x3 6 z1 7 8 input x1 x2 x3 9 output z1 10 11 wire x1 x2 x3 12 reg z1 13 alw
  • __autoload()不执行的解决办法spl_autoload_register();

    在php5之后已经有了类的自动加载机制 可以定义 autoload函数 在使用到某个未定义的类 执行php会出错 但是在此时php引擎在返回失败之前会去check下是否有定义 autoload去加载需要的类 但是 今天晚上 autoload
  • 原生Photoshop2022 for Mac v23.4最新中文版功能介绍 PS2022苹果安装教程支持M1,解决安装ps提示不存在、Error may be damaged已损坏等问题

    PS2022中文激活版是一款高效 专业 实用的图像处理软件 其以其强悍的编辑和调整 绘图等功能 从而受到了广泛的应用 不管是在各种图片的调整和图画绘制以及图像的修复 调色等工具都是数不胜数的 用户可以从自己照片修饰到海报 包装 横幅的制作以
  • 【Java项目】拉取公司GitLab项目的教程

    文章目录 创建Git账号 登录Git 创建Git账号 进入公司后 会拿到公司给你注册的邮箱以及密码 你得到用户名和密码之后 需要先创建一个拉取这个仓库对应的git账号 我们先登录GitLab 当你登录GitLab之后 会显示你还没有ssh
  • STM32 嵌入式开发常用网站推荐

    作者 蚂蚁会游泳 日期 2022 06 11 前言 本文推荐了一些做嵌入式软硬件开发常用到的网站 一 资料下载 正点原子资料下载中心 描述 该网站可以下载正点原子各种开发板的软件资料 网址 http www openedv com docs
  • 机器学习——特征工程和评价指标

    0 前言 首先学习特征工程这部分知识之前 要对机器学习的算法用过使用 1 特征工程 就机器学习的数据而言 特征就是数据的列名 有多少列 就有多少个维度的特征 就定义而言 特征是指数据中抽取出来对结果预测有用的信息 特征工程就是使用一些技巧来
  • 64位java8,jdk8下载,解压版

    JAVA8使用量非常广泛 但是找下往往都是安装版的 想我这种人直接自己配置环境变量用 十分不想搞个安装版 下面是解压版的 下面是打印出的version信息 wndows版本的 下面是java version的信息 直接拿走 java ver
  • 关于在linux(Ubuntu 18.04.1 LTS)环境中安装并使用AppImageLauncher

    安装步骤 1 去github上下载AppImageLauncher deb 文件 2 在下载文件所在文件夹下打开终端输入 sudo dpkg f filename deb 3 报错提示缺少依赖项 则继续输入一下内容 sudo apt get
  • 大数据 爬取网站并分析数据

    大数据 爬取前程无忧校园招聘 flume hive mysql 数据可视化 自己搭建的hadoop博客 1 爬取前程无忧网页和校园招聘 1 1用scrapy爬取前途无忧网站 我爬了10w多条数据 在存入MongoDB中 1 2 存入Mogo
  • JSP弹出对话框两种实现方式

    JSP弹出对话框两种实现方式 1 一种是弹出一个新的窗体出来 window open test html 用于控制弹出新的窗口test html 如果test html不与主窗口在同一路径下 前面应写明路径 绝对路径 http 和相对路径
  • 【NOIP 2004 提高组】合并果子

    题就自己找啦 各大OJ上应该都有 题目 题目描述 在一个果园里 多多已经将所有的果子打了下来 而且按果子的不同种类分成了不同的堆 多多决定把所有的果子合成一堆 每一次合并 多多可以把两堆果子合并到一起 消耗的体力等于两堆果子的重量之和 可以
  • NewMoonDog 影子狗 基于JavaScript的跑酷游戏,复制就能玩

    这是一款横版跑酷类游戏 应为是JavaScript的所以不需要其他复杂的配置和环境 点击就能运行 线上试玩 http longsong games newmoon 文末有代码地址 操作介绍 跳跃 坐下 跳砍 往后跑 向前跑 enter 无敌
  • Python-pandas的基础函数

    zstarling 基础 进阶 多表处理 索引index 的用途 基础 import pandas as pd list1 001 002 003 df pd Series list1 df2 df map int print df2 df
  • 15_Numpy使用sort和argsort函数进行(行・列)排序

    15 Numpy使用sort和argsort函数进行 行 列 排序 如果将NumPy函数numpy sort 应用于二维NumPy数组ndarray 则可以获得一个ndarray 其中每一行和每一列的值都按升序分别排序 如果要按特定的行或列
  • Neo4j入门(五)删除节点的正确姿势

    本文还是照例讲讲自己工作中遇到的坑 本文将会讲述如何在Neo4j中正确地删除节点 图数据库在删除节点的时候 并不像删除属性和删除关系那样方便 原因就在于删除节点时 可能有关系与之相连 因此需要考虑这个问题 Neo4j在删除节点时 已经考虑了
  • centos下升级python

    wget http www python org ftp python 2 6 Python 2 6 tgz tar zxvf Python 2 6 tgz cd Python 2 6 configure enable ipv6 prefi
  • 你知道豆瓣电影是怎么评分的吗?(实战篇—手把手教你分析豆瓣电影)

    点赞再看 养成好习惯 Python版本3 8 0 开发工具 Pycharm 写在前面的话 如果你是因为看到标题进来的 那恭喜你 又多了一个涨 入 知 坑 识的机会 在这篇豆瓣电影Top250的分析文章中 你并不会得到一个像标题那样确切的答案
  • java 代码 导出表结构生成doc文档(支持MySQL,Oracle)

    1 导入依赖