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

  1. package net.cloudkit.management.util;
  2.  
  3. import org.apache.poi.openxml4j.opc.OPCPackage;
  4. import org.apache.poi.ss.usermodel.Row;
  5. import org.apache.poi.ss.usermodel.Workbook;
  6. import org.apache.poi.xssf.streaming.SXSSFSheet;
  7. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
  8. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  9. import java.io.*;
  10. import java.sql.*;
  11.  
  12. import java.util.*;
  13.  
  14. /**
  15. * @author : gongtao
  16. * @version : 2017/9/6
  17. */
  18. public class TableToExcel {
  19.  
  20. private String tableName = "";//表名
  21. private String[] colNames; // 列名数组
  22. private String[] colComment; // 列名数组
  23. private String[] colTypes; //列名类型数组
  24. private int[] colSizes; //列名大小数组
  25. //数据库连接
  26. private static final String URL ="jdbc:mysql://192.168.1.101:3306/management?useUnicode=true&characterEncoding=UTF-8";
  27. private static final String NAME = "root";
  28. private static final String PASS = "admin123";
  29. private static final String DRIVER ="com.mysql.jdbc.Driver";
  30.  
  31. public void genEntitySomeTable(List<String> tableNames){
  32. for(int p=0;p<tableNames.size();p++){
  33. tableName=tableNames.get(p);
  34. //创建连接
  35. Connection con = null;
  36. //查要生成实体类的表
  37. String sql = "select * from " + tableName;
  38. String sql2 = "show full fields from " + tableName;
  39. PreparedStatement pStemt = null;
  40. PreparedStatement pStemt2 = null;
  41. try {
  42. try {
  43. Class.forName(DRIVER);
  44. } catch (ClassNotFoundException e1) {
  45. e1.printStackTrace();
  46. }
  47. con = DriverManager.getConnection(URL,NAME,PASS);
  48. pStemt = con.prepareStatement(sql);
  49. ResultSetMetaData rsmd = pStemt.getMetaData();
  50. pStemt2 = con.prepareStatement(sql2);
  51. ResultSet rsResultSet=pStemt2.executeQuery();
  52. int size = rsmd.getColumnCount(); //统计列
  53. colNames = new String[size];
  54. colTypes = new String[size];
  55. colSizes = new int[size];
  56. colComment = new String[size];
  57. int j=0;
  58. while (rsResultSet.next()) {
  59. //System.out.println(rsResultSet.getObject(9));
  60. colComment[j]=rsResultSet.getObject(9).toString();
  61. j++;
  62. }
  63. for (int i = 0; i < size; i++) {
  64. colNames[i] = rsmd.getColumnName(i + 1);
  65. colTypes[i] = rsmd.getColumnTypeName(i + 1);
  66. if (colTypes[i] .equals("INT")){
  67. colTypes[i] = "INTEGER";
  68. }
  69. colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
  70. }
  71.  
  72. createExcel();
  73.  
  74. } catch (Exception e) {
  75. e.printStackTrace();
  76. } finally{
  77. try {
  78. if (con != null){
  79. con.close();
  80. }
  81. } catch (SQLException e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. System.out.println("生成完毕!");
  87. }
  88.  
  89. public void createExcel() throws Exception{
  90. //获取Excel模版文件目录
  91. String path = "D:/template.xlsx";
  92. path = path.replaceAll("%20", " ");
  93. try(InputStream fileInputStream = new FileInputStream(path);
  94. //通过Excel模板目录获取Excel模版文件
  95. XSSFWorkbook workbook1 = new XSSFWorkbook(OPCPackage.open(fileInputStream));
  96. //利用POI3.8及其以上,每个Sheet可以存1,048,576行数据,每行可以有16,384列数据
  97. Workbook workbook = new SXSSFWorkbook(workbook1, 100)){
  98. //重命名sheet工作表名称:第几个工作表
  99. workbook.setSheetName(0, tableName);
  100. //创建sheet工作表
  101. SXSSFSheet sheet = (SXSSFSheet) workbook.getSheetAt(0);
  102. //从模板sheet工作表第几行开始插入(注意行、列、单元格都是从0开始数)
  103. int startRow = 1;
  104. for (int i = 0;i<colSizes.length;i++){
  105. Row row = sheet.createRow(startRow++);
  106. row.createCell(1).setCellValue(colNames[i]);
  107. row.createCell(2).setCellValue(colTypes[i] + "(" + colSizes[i] + ")");
  108. row.createCell(3).setCellValue(colComment[i]);
  109. }
  110. try(ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
  111. workbook.write(outputStream);
  112. //输出目录
  113. String filePath = "D:/" + tableName + ".xlsx";
  114. File file = new File(filePath);
  115. try(FileOutputStream fileOutputStream = new FileOutputStream(file);
  116. ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray())) {
  117. byte[] bytes = new byte[1024];
  118. int len;
  119. while ((len = byteArrayInputStream.read(bytes)) != -1){
  120. fileOutputStream.write(bytes,0,len);
  121. }
  122. }
  123. }
  124. }
  125. }
  126.  
  127. public static void main(String[] args) {
  128. TableToExcel tableToExcel = new TableToExcel();
  129. List<String> dataList = new ArrayList<>();
  130. //添加表名
  131. dataList.add("operation_log");
  132. tableToExcel.genEntitySomeTable(dataList);
  133. }
  134.  
  135. }

数据库表结构:

  1. CREATE TABLE `operation_log` (
  2. `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  3. `DATA_ID` bigint(20) DEFAULT NULL COMMENT '操作数据ID',
  4. `TABLE_NAME` varchar(64) DEFAULT NULL COMMENT '对应表名',
  5. `MODULE_NAME` varchar(64) DEFAULT NULL COMMENT '模块名称',
  6. `OPERATION` varchar(64) DEFAULT NULL COMMENT '具体操作',
  7. `TYPE` int(11) DEFAULT NULL COMMENT '类型:1、INFO 2、DEBUG 3、ERROR',
  8. `MESSAGE` varchar(5120) DEFAULT NULL COMMENT '信息',
  9. `OPERATION_USER` varchar(32) DEFAULT NULL COMMENT '操作人',
  10. `ROW_STATUS` int(8) DEFAULT NULL COMMENT '记录状态',
  11. `MODIFY_TIME` bigint(20) DEFAULT NULL COMMENT '修改时间',
  12. `CREATE_TIME` bigint(20) DEFAULT NULL COMMENT '创建时间',
  13. PRIMARY KEY (`ID`)
  14. ) 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. HttpClient 专题

    HttpClient is a HTTP/1.1 compliant HTTP agent implementation based on HttpCore. It also provides reu ...

  2. web网络协议

    一.OSI七层模型   OSI参考模型是国际标准化组织ISO(International Standards Organization )制定的模型,把计算机与计算机之间的通信分成七个互相连接的协议层 ...

  3. 关于原生js中bind函数的实现

    今天继续研究了bind函数的实现,也知道了shim和polyfill的说法,现在总结一下, if (!Function.prototype.bind) { Function.prototype.bin ...

  4. 你不知道的JavaScript--Item1 严格模式

    本文转自[阮一峰博客]:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 一.概述 除了正常运行模式,ECMAscr ...

  5. React Native 之极光推送jpush-react-native 手把手配置

    这是 react native 配置极光推送使用的组件,比较常用https://github.com/jpush/jpush-react-native 先把组件地址贴出来,方便大家使用参考.如果这个大 ...

  6. MYSQL—— year类型的使用与注意点!

    mysql的日期与时间类型:分为time.date.datetime.timestamp.year,主要总结下year的用法: 1.类型支持:year 与 year(4),注意无year(2)的定义方 ...

  7. Typora + Mathpix Snip,相见恨晚的神器

    word 文档虽然很好,但当我需要输入一大堆公式的时候,word 公式让我疯狂. Why markdown?首先,GitHub 上都在用,那我也得会吧,不然 README.md 怎么写:其次,mark ...

  8. Netty基础系列(1) --linux网路I/O模型

    引言 我一直认为对于java的学习,掌握基础的性价比要远远高于使用框架,而基础知识中对于网络相关知识的掌握也是重中之重.对于一个java程序来说,无论是工作中还是面试,对于Netty的掌握都是及其重要 ...

  9. 【ODI】| 数据ETL:从零开始使用Oracle ODI完成数据集成(一)

    0. 环境说明及软件准备 ODI(Oracle Data Integrator)是Oracle公司提供的一种数据集成工具,能高效地实现批量数据的抽取.转换和加载.ODI可以实现当今大多数的主流关系型数 ...

  10. 《k8s-1.13版本源码分析》- Scheduler启动前逻辑

    本文原始地址(gitbook格式):https://farmer-hutao.github.io/k8s-source-code-analysis/core/scheduler/before-sche ...