最近需要写文档,由于开发模式是先开发后写文档(不想吐槽。。。),数据库表结构什么的都搞好了,然后写文档的时候需要贴表结构,什么字段,类型,相关说明需要一一对应起来,数据库表10多张,字段又多,手动复制粘贴太蛋疼了,于是就写了个将表结构转excel表格的简单实现(丑是丑了点,毕竟实现功能了不是)。

package net.cloudkit.management.util;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.sql.*; import java.util.*; /**
* @author : gongtao
* @version : 2017/9/6
*/
public class TableToExcel { private String tableName = "";//表名
private String[] colNames; // 列名数组
private String[] colComment; // 列名数组
private String[] colTypes; //列名类型数组
private int[] colSizes; //列名大小数组
//数据库连接
private static final String URL ="jdbc:mysql://192.168.1.101:3306/management?useUnicode=true&characterEncoding=UTF-8";
private static final String NAME = "root";
private static final String PASS = "admin123";
private static final String DRIVER ="com.mysql.jdbc.Driver"; public void genEntitySomeTable(List<String> tableNames){
for(int p=0;p<tableNames.size();p++){
tableName=tableNames.get(p);
//创建连接
Connection con = null;
//查要生成实体类的表
String sql = "select * from " + tableName;
String sql2 = "show full fields from " + tableName;
PreparedStatement pStemt = null;
PreparedStatement pStemt2 = null;
try {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
con = DriverManager.getConnection(URL,NAME,PASS);
pStemt = con.prepareStatement(sql);
ResultSetMetaData rsmd = pStemt.getMetaData();
pStemt2 = con.prepareStatement(sql2);
ResultSet rsResultSet=pStemt2.executeQuery();
int size = rsmd.getColumnCount(); //统计列
colNames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
colComment = new String[size];
int j=0;
while (rsResultSet.next()) {
//System.out.println(rsResultSet.getObject(9));
colComment[j]=rsResultSet.getObject(9).toString();
j++;
}
for (int i = 0; i < size; i++) {
colNames[i] = rsmd.getColumnName(i + 1);
colTypes[i] = rsmd.getColumnTypeName(i + 1);
if (colTypes[i] .equals("INT")){
colTypes[i] = "INTEGER";
}
colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
} createExcel(); } catch (Exception e) {
e.printStackTrace();
} finally{
try {
if (con != null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
System.out.println("生成完毕!");
} public void createExcel() throws Exception{
//获取Excel模版文件目录
String path = "D:/template.xlsx";
path = path.replaceAll("%20", " ");
try(InputStream fileInputStream = new FileInputStream(path);
//通过Excel模板目录获取Excel模版文件
XSSFWorkbook workbook1 = new XSSFWorkbook(OPCPackage.open(fileInputStream));
//利用POI3.8及其以上,每个Sheet可以存1,048,576行数据,每行可以有16,384列数据
Workbook workbook = new SXSSFWorkbook(workbook1, 100)){
//重命名sheet工作表名称:第几个工作表
workbook.setSheetName(0, tableName);
//创建sheet工作表
SXSSFSheet sheet = (SXSSFSheet) workbook.getSheetAt(0);
//从模板sheet工作表第几行开始插入(注意行、列、单元格都是从0开始数)
int startRow = 1;
for (int i = 0;i<colSizes.length;i++){
Row row = sheet.createRow(startRow++);
row.createCell(1).setCellValue(colNames[i]);
row.createCell(2).setCellValue(colTypes[i] + "(" + colSizes[i] + ")");
row.createCell(3).setCellValue(colComment[i]);
}
try(ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
workbook.write(outputStream);
//输出目录
String filePath = "D:/" + tableName + ".xlsx";
File file = new File(filePath);
try(FileOutputStream fileOutputStream = new FileOutputStream(file);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray())) {
byte[] bytes = new byte[1024];
int len;
while ((len = byteArrayInputStream.read(bytes)) != -1){
fileOutputStream.write(bytes,0,len);
}
}
}
}
} public static void main(String[] args) {
TableToExcel tableToExcel = new TableToExcel();
List<String> dataList = new ArrayList<>();
//添加表名
dataList.add("operation_log");
tableToExcel.genEntitySomeTable(dataList);
} }

数据库表结构:

CREATE TABLE `operation_log` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`DATA_ID` bigint(20) DEFAULT NULL COMMENT '操作数据ID',
`TABLE_NAME` varchar(64) DEFAULT NULL COMMENT '对应表名',
`MODULE_NAME` varchar(64) DEFAULT NULL COMMENT '模块名称',
`OPERATION` varchar(64) DEFAULT NULL COMMENT '具体操作',
`TYPE` int(11) DEFAULT NULL COMMENT '类型:1、INFO 2、DEBUG 3、ERROR',
`MESSAGE` varchar(5120) DEFAULT NULL COMMENT '信息',
`OPERATION_USER` varchar(32) DEFAULT NULL COMMENT '操作人',
`ROW_STATUS` int(8) DEFAULT NULL COMMENT '记录状态',
`MODIFY_TIME` bigint(20) DEFAULT NULL COMMENT '修改时间',
`CREATE_TIME` bigint(20) DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '操作日志表';

模板excel:

生成的excel:

mysql 表结构转excel表格的更多相关文章

  1. 在sqlserver 中如何导出数据库表结构到excel表格中

    先建空白excel--在数据库中的左侧找到该表, 选中需要导出的数据--Ctrl+C复制--打开记事本修改编码格式为Unicode-不自动换行保存--Ctrl+A--Ctrl+C,再打开excel-- ...

  2. MySQL表结构导出Excel

    1. information_schema.COLUMNS表记录了所有库中所有表的字段信息 SELECT COLUMN_NAME 字段名称, COLUMN_TYPE 字段类型, COLUMN_DEFA ...

  3. Mysql表结构导出excel(含数据类型、字段备注注释)

    SELECT   "列名",   "数据类型",     "字段类型",   "长度",  "是否为空&quo ...

  4. 查看mysql表结构和表创建语句的方法(转)

    查看mysql表结构的方法有三种:1.desc tablename;例如:要查看jos_modules表结构的命令:desc jos_modules;查看结果:mysql> desc jos_m ...

  5. SQL SERVER 自动生成 MySQL 表结构及索引 的建表SQL

          SQL SERVER的表结构及索引转换为MySQL的表结构及索引,其实在很多第三方工具中有提供,比如navicat.sqlyog等,但是,在处理某些数据类型.默认值及索引转换的时候,总有些 ...

  6. mysql:恢复mysql表结构

    mysql,frm格式恢复mysql表结构,以tuser.frm格式为例   新增数据库,如下,创建数据库名为ab   打开数据库,双击打开数据库   点右键新建表结构   新增表,里面只添加一个字段 ...

  7. MySQL表结构同步工具 mysql-schema-sync

    mysql-schema-sync 是一款使用go开发的.跨平台的.绿色无依赖的 MySQL 表结构自动同步工具.用于将线上(其他环境)数据库结构变化同步到测试(本地)环境! 可以解决多人开发,每人都 ...

  8. [转载]github在线更改mysql表结构工具gh-ost

    GitHub正式宣布以开源的方式发布gh-ost:GitHub的MySQL无触发器在线更改表定义工具! gh-ost是GitHub最近几个月开发出来的,目的是解决一个经常碰到的问题:不断变化的产品需求 ...

  9. 【转】查看mysql表结构和表创建语句的方法

    转自:http://blog.csdn.net/business122/article/details/7531291 查看mysql表结构的方法有三种: 1.desc tablename; 例如: ...

随机推荐

  1. 剑指Offer常见问题整理

    1 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.(来自牛客网,剑指offer) ...

  2. Dubbo源码-Dubbo是如何随心所欲自定义XML标签的

    叨叨 今天考虑了很久要不要写这篇文章. 距离<Dubbo源码>系列的开篇到现在已经快两个月时间了.当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样 ...

  3. [ Java面试题 ]算法篇

    1.堆和栈在内存中的区别是什么? 概念: 栈(stack)是为执行线程留出的内存空间.当函数被调用的时候,栈顶为局部变量和一些 bookkeeping 数据预留块.当函数执行完毕,块就没有用了,可能在 ...

  4. Python——pip安装报错:is not a supported wheel on this platform

    pip安装报错:is not a supported wheel on this platform 可能的原因1:安装的不是对应python版本的库,下载的库名中cp35代表python3.5,其它同 ...

  5. bzoj 2829 计算几何

    将每张卡四个角的圆心跑graham出正常凸包,再加上一个圆就好了. 要注意先输入的是x,找点时三角函数瞎换就过了.. #include<cstdio> #include<cstrin ...

  6. mac升级后idea提示Can't start git

    试了官网的解决方案,还是不行,然后到Stack Overflow上面,找到了下面这个方法,完美解决. 在命令行中运行: xcode-select --install 安装软件就可以了.

  7. ServletContextListener

    在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期. 当Serv ...

  8. shell脚本中cd命令无效

    对于一段包含cd 命令的shell脚本(test.sh): #!/bin/bash cd .. mkdir ./test 运行: sh ./test.sh 脚本运行时无法在上级目录建立test文件 此 ...

  9. 对称加密算法 ~ Des

    一.对称加密 (Symmetric Key Encryption)  对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret ...

  10. MySQL 中基于 XA 实现的分布式事务

    1 XA协议 首先我们来简要看下分布式事务处理的XA规范可知XA规范中分布式事务有AP,RM,TM组成: 其中应用程序(Application Program ,简称AP):AP定义事务边界(定义事务 ...