有时候要建很多表或一个表有很多字段,一个个复制字段弄太麻烦了,为了提高点工作效率,写了个小工具通过固定的excel模板自动生成基础的ddl建表语句
maven依赖

        <!--核心jar包--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version></dependency>

工具类

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.util.Iterator;/*** @author Jack Li* @description 读取excel文件内容生成数据库表ddl* @date 2022/3/27 19:54*/public class ExcelUtils {/*** 读取excel文件内容生成数据库表ddl** @param filePath excel文件的绝对路径*/public static void getDataFromExcel(String filePath) {if (!filePath.endsWith(".xls") && !filePath.endsWith(".xlsx")) {System.out.println("文件不是excel类型");}InputStream fis = null;Workbook wookbook = null;try {fis = new FileInputStream(filePath);if (filePath.endsWith(".xls")) {try {//2003版本的excel,用.xls结尾wookbook = new HSSFWorkbook(fis);} catch (IOException e) {e.printStackTrace();}}if (filePath.endsWith(".xlsx")) {try {//2007版本的excel,用.xlsx结尾wookbook = new XSSFWorkbook(fis);} catch (IOException e) {e.printStackTrace();}}Iterator<Sheet> sheets = wookbook.sheetIterator();while (sheets.hasNext()) {StringBuilder ddl = new StringBuilder();// 是否自增boolean autoIncrement = false;Sheet sheet = sheets.next();System.out.println("--------------------------当前读取的sheet页:" + sheet.getSheetName() + "--------------------------");// 当前读取行的行号int rowId = 1;Iterator<Row> rows = sheet.rowIterator();String tableEnglishName = "";String tableChineseName = "";while (rows.hasNext()) {Row row = rows.next();//获取表英文名if (rowId == 1) {Cell cell1 = row.getCell(0);if (!"表英文名".equals(cell1.getStringCellValue())) {System.out.println("第一行第一格应该为“表英文名”!");return;}Cell cell2 = row.getCell(1);tableEnglishName = cell2.getStringCellValue();ddl.append("CREATE TABLE " + "`" + tableEnglishName + "` (" + "\r\n");rowId++;continue;}//获取表中文名if (rowId == 2) {Cell cell1 = row.getCell(0);if (!"表中文名".equals(cell1.getStringCellValue())) {System.out.println("第2行第一格应该为“表中文名”!");return;}Cell cell2 = row.getCell(1);tableChineseName = cell2.getStringCellValue();rowId++;continue;}//校验属性列名称和顺序if (rowId == 3) {if (row.getPhysicalNumberOfCells() != 6) {System.out.println("第2行应该只有6个单元格!");return;}Iterator<Cell> cells = row.cellIterator();StringBuilder tableField = new StringBuilder();while (cells.hasNext()) {tableField.append(cells.next().getStringCellValue().trim());}if (!"字段名类型长度,小数点是否为主键是否自增注释".equals(tableField.toString())) {System.out.println("第3行应该为 字段名 类型 长度,小数点 是否为主键 是否自增 注释 !");return;}rowId++;continue;}if (!row.cellIterator().hasNext()) {break;}// 字段名String fieldName = row.getCell(0).getStringCellValue();if (fieldName == null | "".equals(fieldName)){break;}// 字段类型String fieldType = row.getCell(1).getStringCellValue();// 字段长度Cell cell3 = row.getCell(2);cell3.setCellType(CellType.STRING);String fieldLength = cell3.getStringCellValue();// 是否为主键Cell cell4 = row.getCell(3);// 是否自增Cell cell5 = row.getCell(4);// 字段注释String fieldComment = row.getCell(5).getStringCellValue();ddl.append("`" + fieldName + "` "+ fieldType+ (!"0".equals(fieldLength) ? "(" + fieldLength + ")" : "")+ (cell4 != null && "Y".equals(cell4.getStringCellValue()) ? " PRIMARY KEY " : "")+ (cell5 != null && "Y".equals(cell5.getStringCellValue()) ? " AUTO_INCREMENT " : "")+ " COMMENT '" + fieldComment + "'"+ (rows.hasNext() ? ",\r\n" : "\r\n"));if (cell4 != null && "Y".equals(cell5.getStringCellValue())) {autoIncrement = true;}rowId++;}if (ddl.toString().endsWith(",\r\n")){ddl = ddl.deleteCharAt(ddl.length()-3);ddl.append("\r\n");}ddl.append(") ENGINE=InnoDB " + (autoIncrement ? "AUTO_INCREMENT=1" : "") + " DEFAULT CHARSET=utf8 "+ (!"".equals(tableChineseName) ? "COMMENT = '" + tableChineseName + "'" : "") + ";\r\n");ddl.append("-- --------------------------------------------------------------------------------\r\n");System.out.println(ddl.toString());writeMessageToFile(ddl.toString());}System.out.println("运行成功");} catch (Exception e) {e.printStackTrace();} finally {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}public static void writeMessageToFile(String message) {try {File file = new File("ddl.txt");if (!file.exists()) {file.createNewFile();}FileWriter fileWriter = new FileWriter(file.getName(), true);fileWriter.write(message);fileWriter.close();} catch (IOException e) {e.printStackTrace();}}}

excel模板

效果

gitee

使用java通过固定的excel模板自动生成数据库表的ddl建表语句相关推荐

  1. java自动生成数据库代码

    自从学习计算机以来,学习了很多知识,都是从网上学习的,特别感谢网络,经常自比网络的boy, 现在把我过去做的工具共享出来,希望给大家的工作与学习带来帮助. webtool自动生成数据库代码,支持mys ...

  2. Java 利用EasyPoi做Excel模板的导入导出操作

    Java 利用EasyPoi做Excel模板的导入导出操作 项目背景 加入pom依赖 项目Excel模板图 代码实现 首先是实体类定义 Excel 实现导入 Excel的导出 结束语 项目背景 作为一 ...

  3. Chimm.Excel —— 使用Java 操作 excel 模板文件生成 excel 文档

    内容已不在此处更新,请移步https://blog.csdn.net/chimmhuang/article/details/111251115 1. 项目介绍 Chimm.Excel 是什么? 该程序 ...

  4. 表格 自动生成流程图 python_Visio竟然可以根据Excel数据自动生成流程图,这也太牛了吧!...

    前段时间受邀去到一家制造型企业培训Excel,在课前沟通的阶段,客户提出一个需求,希望在课程中能介绍一下如何在Excel中绘制流程图.虽然Excel是一个功能非常强大的数据分析工具,但它也不是一个万金 ...

  5. Java支持latex,基于Java和LaTeX的文档自动生成技术研究

    基于Java和 LaTeX 的文档 自动生成技术研究 ◆尚宝欣 徐 屹 (东北电力大学理学院,吉林 长春 132012) [摘 要]讨论了结合Java与LaTex 自动生成 PDF文档的方法.针 展名 ...

  6. java实体类生成mysql表_springboot+mybatis通过实体类自动生成数据库表的方法

    前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 org.mybatis ...

  7. android getter不起作用,java - 如何在Android Studio中自动生成getter和setter

    java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...

  8. python excel模板 生成excel表格_python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图...

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 #coding=utf-8 from openpyxl importload_workbookfro ...

  9. 计算机网络应用答题卡,网上阅卷系统中答题卡模板自动生成技术研究

    摘要: 存各种考试阅卷工作中,传统的手工阅卷消耗巨大的人力和物力,阅卷效率低,且不能保证阅卷质量,同时纸质试卷的保存和运输工作也非常繁杂.因此,随着计算机网络技术和数字图像处理技术的快速发展,一套基于 ...

最新文章

  1. 基于Struts2框架的名片管理系统
  2. LeetCode Implement strStr(kmp或者BM)
  3. 《树莓派开发实战(第2版)》——1.7 连接DVI或VGA显示器
  4. Windows8 Metro开发 (02) : AppBar控件之TopAppBar
  5. 对CAS机制的理解(二)
  6. VTK:几何对象之PlaneSource
  7. jzoj4228-C【dp】
  8. 使用Selenide进行有效的UI测试
  9. abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之六(三十二)
  10. 3.过滤——相关滤波(Correlation Filtering)_3
  11. linux运行多个c文件路径,linux c的连接库和怎么同时编译多个源程序
  12. linux lvm的管理
  13. 基于python和mysql的查询操作
  14. 直击硅谷最火全球区块链峰会,40位大咖讲了啥?
  15. Django admin修改app名称
  16. 开发可以自动运行程序的U盘
  17. android 微博sdk 集成 文件不存在(8998) 您所访问的站点在新浪微博的认证失败,错误码 21322
  18. Injected and Delivered: Fabricating Implicit Control over Actuation Systems by Spoofing Inertial Sen
  19. python pip 安装失败问题解决
  20. Unity3d之骨骼动画

热门文章

  1. 图解二叉树的三种遍历
  2. linux和windows文件共享软件,桌面应用|如何在 Linux 和 Windows 之间共享 Steam 的游戏文件...
  3. 【面试真题】学员的Linux运维面试复盘
  4. LeetCode:205(Python)—— 同构字符串(简单)
  5. Android 11.0 系统默认授予app安装权限(去掉app首次运行时权限授权弹窗)
  6. ES6学习笔记(字符串扩展)
  7. vue轻松实现虚拟滚动
  8. 苹果电脑 MacOS 遭恶意软件针对,监控通信流量又很难发现
  9. 读研期间小论文投稿-个人总结
  10. Hadoop基础之《(8)—yarn dr.who用户漏洞被挖矿》