使用java通过固定的excel模板自动生成数据库表的ddl建表语句
有时候要建很多表或一个表有很多字段,一个个复制字段弄太麻烦了,为了提高点工作效率,写了个小工具通过固定的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建表语句相关推荐
- java自动生成数据库代码
自从学习计算机以来,学习了很多知识,都是从网上学习的,特别感谢网络,经常自比网络的boy, 现在把我过去做的工具共享出来,希望给大家的工作与学习带来帮助. webtool自动生成数据库代码,支持mys ...
- Java 利用EasyPoi做Excel模板的导入导出操作
Java 利用EasyPoi做Excel模板的导入导出操作 项目背景 加入pom依赖 项目Excel模板图 代码实现 首先是实体类定义 Excel 实现导入 Excel的导出 结束语 项目背景 作为一 ...
- Chimm.Excel —— 使用Java 操作 excel 模板文件生成 excel 文档
内容已不在此处更新,请移步https://blog.csdn.net/chimmhuang/article/details/111251115 1. 项目介绍 Chimm.Excel 是什么? 该程序 ...
- 表格 自动生成流程图 python_Visio竟然可以根据Excel数据自动生成流程图,这也太牛了吧!...
前段时间受邀去到一家制造型企业培训Excel,在课前沟通的阶段,客户提出一个需求,希望在课程中能介绍一下如何在Excel中绘制流程图.虽然Excel是一个功能非常强大的数据分析工具,但它也不是一个万金 ...
- Java支持latex,基于Java和LaTeX的文档自动生成技术研究
基于Java和 LaTeX 的文档 自动生成技术研究 ◆尚宝欣 徐 屹 (东北电力大学理学院,吉林 长春 132012) [摘 要]讨论了结合Java与LaTex 自动生成 PDF文档的方法.针 展名 ...
- java实体类生成mysql表_springboot+mybatis通过实体类自动生成数据库表的方法
前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 org.mybatis ...
- android getter不起作用,java - 如何在Android Studio中自动生成getter和setter
java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...
- python excel模板 生成excel表格_python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图...
python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 #coding=utf-8 from openpyxl importload_workbookfro ...
- 计算机网络应用答题卡,网上阅卷系统中答题卡模板自动生成技术研究
摘要: 存各种考试阅卷工作中,传统的手工阅卷消耗巨大的人力和物力,阅卷效率低,且不能保证阅卷质量,同时纸质试卷的保存和运输工作也非常繁杂.因此,随着计算机网络技术和数字图像处理技术的快速发展,一套基于 ...
最新文章
- 基于Struts2框架的名片管理系统
- LeetCode Implement strStr(kmp或者BM)
- 《树莓派开发实战(第2版)》——1.7 连接DVI或VGA显示器
- Windows8 Metro开发 (02) : AppBar控件之TopAppBar
- 对CAS机制的理解(二)
- VTK:几何对象之PlaneSource
- jzoj4228-C【dp】
- 使用Selenide进行有效的UI测试
- abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之六(三十二)
- 3.过滤——相关滤波(Correlation Filtering)_3
- linux运行多个c文件路径,linux c的连接库和怎么同时编译多个源程序
- linux lvm的管理
- 基于python和mysql的查询操作
- 直击硅谷最火全球区块链峰会,40位大咖讲了啥?
- Django admin修改app名称
- 开发可以自动运行程序的U盘
- android 微博sdk 集成 文件不存在(8998) 您所访问的站点在新浪微博的认证失败,错误码 21322
- Injected and Delivered: Fabricating Implicit Control over Actuation Systems by Spoofing Inertial Sen
- python pip 安装失败问题解决
- Unity3d之骨骼动画
热门文章
- 图解二叉树的三种遍历
- linux和windows文件共享软件,桌面应用|如何在 Linux 和 Windows 之间共享 Steam 的游戏文件...
- 【面试真题】学员的Linux运维面试复盘
- LeetCode:205(Python)—— 同构字符串(简单)
- Android 11.0 系统默认授予app安装权限(去掉app首次运行时权限授权弹窗)
- ES6学习笔记(字符串扩展)
- vue轻松实现虚拟滚动
- 苹果电脑 MacOS 遭恶意软件针对,监控通信流量又很难发现
- 读研期间小论文投稿-个人总结
- Hadoop基础之《(8)—yarn dr.who用户漏洞被挖矿》