程序员要学会偷懒--excel转建表语句

news2025/2/27 13:17:40

如下需求:一个复杂的统战系统,用户信息字段总共有26个sheet,54张小表,没有什么复杂的业务逻辑,纯增删改查。字段目测在1000个以上。建表54张。领导交待了一句这周末完成,我???
此时就要学会偷懒了。
在这里插入图片描述
偷懒的思路:
1.将excel表读到java中。
2:用拼音命名字段,1000多个字典,光起字段名就足够消耗你N多时间了。而用拼音,则可根据表内的中文名称作生成。这点用工具类是可以做到的。
3:成生建表语句
代码如下:

public class CreateTableMain {

    private static String CREATE_SQL = "CREATE TABLE %s (id varchar(60) primary key,%s) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='%s';";
    private static String COLUMN_SQL = "%s varchar(100) COMMENT '%s'";

    public static void main(String[] args) {
        ExcelReader reader = ExcelUtil.getReader("D:\\ccc\\tongzhan.xlsx");
        List<String> tables = new ArrayList<>();
        tables.add(readTable(reader, 1, 1, 64));
        tables.add(readTable(reader, 2, 1, 24));
        tables.add(readTable(reader, 2, 26, 41));
        tables.add(readTable(reader, 2, 43, 48));
        tables.add(readTable(reader, 2, 50, 56));
        tables.add(readTable(reader, 2, 58, 65));
        tables.add(readTable(reader, 3, 1, 9));
        tables.add(readTable(reader, 4, 1, 4));
        tables.add(readTable(reader, 5, 1, 4));
        tables.add(readTable(reader, 5, 6, 16));
        tables.add(readTable(reader, 6, 1, 7));
        tables.add(readTable(reader, 7, 1, 19));
        tables.add(readTable(reader, 7, 23, 29));
        tables.add(readTable(reader, 7, 31, 40));
        tables.add(readTable(reader, 8, 1, 8));
        tables.add(readTable(reader, 9, 1, 6));
        tables.add(readTable(reader, 10, 1, 13));
        tables.add(readTable(reader, 11, 1, 18));
        tables.add(readTable(reader, 12, 1, 56));
        tables.add(readTable(reader, 12, 58, 73));
        tables.add(readTable(reader, 12, 75, 78));
        tables.add(readTable(reader, 12, 80, 85));
        tables.add(readTable(reader, 13, 1, 21));
        tables.add(readTable(reader, 14, 1, 11));
        tables.add(readTable(reader, 15, 1, 8));
        tables.add(readTable(reader, 16, 1, 13));
        tables.add(readTable(reader, 17, 1, 15));
        tables.add(readTable(reader, 18, 1, 12));
        tables.add(readTable(reader, 19, 1, 15));
        tables.add(readTable(reader, 19, 17, 23));
        tables.add(readTable(reader, 19, 25, 30));
        tables.add(readTable(reader, 20, 1, 12));
        tables.add(readTable(reader, 21, 1, 10));
        tables.add(readTable(reader, 21, 12, 22));
        tables.add(readTable(reader, 21, 24, 31));
        tables.add(readTable(reader, 21, 33, 40));
        tables.add(readTable(reader, 21, 42, 49));
        tables.add(readTable(reader, 22, 1, 7));
        tables.add(readTable(reader, 23, 1, 13));
        tables.add(readTable(reader, 24, 1, 14));
        tables.add(readTable(reader, 24, 16, 26));
        tables.add(readTable(reader, 24, 28, 38));
        tables.add(readTable(reader, 24, 40, 51));
        tables.add(readTable(reader, 24, 53, 63));
        tables.add(readTable(reader, 24, 65, 72));
        tables.add(readTable(reader, 24, 74, 80));
        tables.add(readTable(reader, 24, 91, 93));
        tables.add(readTable(reader, 24, 95, 100));
        tables.add(readTable(reader, 24, 102, 106));
        tables.add(readTable(reader, 24, 108, 114));
        tables.add(readTable(reader, 24, 116, 122));
        tables.add(readTable(reader, 25, 1, 11));
        tables.add(readTable(reader, 25, 13, 20));
        tables.add(readTable(reader, 26, 1, 5));

        System.out.println("合计表张数=" + tables.size());
        ZYFileUtils.writeLines(tables, new File("D:\\ccc\\统战用户对象信息.sql"), "UTF-8");
    }


    private static String readTable(ExcelReader reader, int sheetIndex, int tableNameY, int endRow) {
        return readTable(reader, sheetIndex, tableNameY, tableNameY + 1, tableNameY + 2, endRow);
    }

    /**
     * @param reader     excel读取器
     * @param sheetIndex sheet的索引
     * @param tableNameY 大标题所在的列(表名,表内第一行那个合并的标题)
     * @param headerRow  表头所在的行(找中文名称)
     * @param startRow   数据开始行
     * @param endRow     数据结束行
     * @return 建表语句
     */
    private static String readTable(ExcelReader reader, int sheetIndex, int tableNameY, int headerRow, int startRow, int endRow) {
        reader.setSheet(sheetIndex - 1);
        Object o = reader.readCellValue(0, tableNameY - 1);
        String tableComment = String.valueOf(o);
        String tableName = ZYPinYinUtils.userName2PinYin(tableComment);

        List<Map<String, Object>> read = reader.read(headerRow - 1, startRow - 1, endRow - 1);
        List<String> columns = new ArrayList<>();
        for (Map<String, Object> row : read) {
            Object mc = row.get("中文名称");
            Object sm = row.get("说明");
            String comment = String.valueOf(mc);
            String pinYin = ZYPinYinUtils.userName2PinYinFirst(comment);
            if (columns.contains(pinYin)) {
                pinYin = pinYin + 1;
                if (columns.contains(pinYin)) {
                    pinYin = pinYin + 1;
                }
            }
            String columnSql = String.format(COLUMN_SQL, pinYin, comment + (ZYStrUtils.isNotNull(sm) ? "(" + String.valueOf(sm) + ")" : ""));
            columns.add(columnSql);
        }
        String columnSqlItem = ZYStrUtils.join(columns, ",");
        return String.format(CREATE_SQL, tableName, columnSqlItem, tableComment);
    }
}

生成的效果:

CREATE TABLE dangpairenzhi (
	id VARCHAR (60) PRIMARY KEY,
	zz / jgmc VARCHAR (100) COMMENT '组织/机构名称(该党内职务任职期间所处的组织、机构的名称。)',
	rzjb VARCHAR (100) COMMENT '任职级别(此次党内职务的级别。)',
	jc VARCHAR (100) COMMENT '届次(该党内职务任职期间所处的届次。)',
	hycs VARCHAR (100) COMMENT '会议次数(该党内职务任职期间所处的会议序列。)',
	zw VARCHAR (100) COMMENT '职务(所任职的职务名称。)',
	qrrq VARCHAR (100) COMMENT '起任日期(开始任职的时间。)',
	xrrq VARCHAR (100) COMMENT '卸任日期(结束任职的时间。)',
	xryy VARCHAR (100) COMMENT '卸任原由(结束任职的原因。)',
	sfxr VARCHAR (100) COMMENT '是否现任(该党内职务是不是正在任职的职务。)',
	sfzz VARCHAR (100) COMMENT '是否专职(该党内职务是不是专职职务。)',
	fgnr VARCHAR (100) COMMENT '分工内容(分工工作的内容。)',
	bz VARCHAR (100) COMMENT '备注(其他需要说明的情况。)'
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '党派任职';

CREATE TABLE hailianhuirenzhi (
	id VARCHAR (60) PRIMARY KEY,
	jb VARCHAR (100) COMMENT '级别(此次任职职务的级别。)',
	ssdo VARCHAR (100) COMMENT '所属地区(此次任职期间所在地区的详细地址。)',
	jc VARCHAR (100) COMMENT '届次(本次任职处于哪一届会议期间。)',
	swmc VARCHAR (100) COMMENT '单位名称(此人员当前所在的工作单位名称。)',
	rzsj VARCHAR (100) COMMENT '任职时间(本次任职的时间。)',
	zw VARCHAR (100) COMMENT '职务(本次工作过程中所处的岗位职务。)',
	rzzt VARCHAR (100) COMMENT '任职状态(当前正在任职的状态。)',
	zwh VARCHAR (100) COMMENT '专委会(本次任职所属的专委会的名称。)',
	zwhzw VARCHAR (100) COMMENT '专委会职务(本次海联会任职所属的专委会职务名称。)'
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '海联会任职';

CREATE TABLE oumeitongxuehuirenzhi (
	id VARCHAR (60) PRIMARY KEY,
	jb VARCHAR (100) COMMENT '级别(此次任职职务的级别。)',
	ssdo VARCHAR (100) COMMENT '所属地区(此次任职期间所在地区的详细地址。)',
	jc VARCHAR (100) COMMENT '届次(本次任职处于哪一届会议期间)',
	swmc VARCHAR (100) COMMENT '单位名称(此人员当前所在的工作单位名称。)',
	rzsj VARCHAR (100) COMMENT '任职时间(本次任职的时间。)',
	zw VARCHAR (100) COMMENT '职务(本次工作过程中所处的岗位职务。)',
	zwh VARCHAR (100) COMMENT '专委会(本次任职所属的专委会的名称。)',
	zwhzw VARCHAR (100) COMMENT '专委会职务(本次欧美同学会任职所属的专委会职务名称。)',
	rzzt VARCHAR (100) COMMENT '任职状态(当前正在任职的情况。)'
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '欧美同学会任职';

CREATE TABLE xinlianhuirenzhi (
	id VARCHAR (60) PRIMARY KEY,
	jb VARCHAR (100) COMMENT '级别(此次任职职务的级别。)',
	ssdo VARCHAR (100) COMMENT '所属地区(此次任职期间所在地区的详细地址。)',
	jc VARCHAR (100) COMMENT '届次(本次任职处于哪一届会议期间)',
	swmc VARCHAR (100) COMMENT '单位名称(此人员当前所在的工作单位名称。)',
	rzsj VARCHAR (100) COMMENT '任职时间(本次任职的时间。)',
	zw VARCHAR (100) COMMENT '职务(本次工作过程中所处的岗位职务。)',
	zwh VARCHAR (100) COMMENT '专委会(本次任职所属的专委会的名称。)',
	zwhzw VARCHAR (100) COMMENT '专委会职务(本次新联会任职所属的专委会职务名称。)',
	rzzt VARCHAR (100) COMMENT '任职状态(当前正在任职的情况。)',
	bz VARCHAR (100) COMMENT '备注(其他需要说明的情况。)'
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '新联会任职';

CREATE TABLE zhilianhuirenzhi (
	id VARCHAR (60) PRIMARY KEY,
	jb VARCHAR (100) COMMENT '级别(此次任职职务的级别。)',
	ssdo VARCHAR (100) COMMENT '所属地区(此次任职期间所在地区的详细地址。)',
	jc VARCHAR (100) COMMENT '届次(本次任职处于哪一届会议期间)',
	swmc VARCHAR (100) COMMENT '单位名称(此人员当前所在的工作单位名称。)',
	rzsj VARCHAR (100) COMMENT '任职时间(本次任职的时间。)',
	zw VARCHAR (100) COMMENT '职务(本次工作过程中所处的岗位职务。)',
	zwh VARCHAR (100) COMMENT '专委会(本次任职所属的专委会的名称。)',
	zwhzw VARCHAR (100) COMMENT '专委会职务(本次政协任职所属的专委会职务名称。)',
	rzzt VARCHAR (100) COMMENT '任职状态(当前正在任职的情况。)'
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '知联会任职';

CREATE TABLE gongshanglianrenzhi (
	id VARCHAR (60) PRIMARY KEY,
	jb VARCHAR (100) COMMENT '级别(此次任职职务的级别。)',
	swmc VARCHAR (100) COMMENT '单位名称(此人员当前所在的工作单位名称。)',
	jc VARCHAR (100) COMMENT '届次(本次任职处于哪一届会议期间)',
	zw VARCHAR (100) COMMENT '职务(本次工作过程中所处的岗位职务。)',
	rzsj VARCHAR (100) COMMENT '任职时间(本次任职的时间。)',
	rzzt VARCHAR (100) COMMENT '任职状态(当前正在任职的情况。)'
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '工商联任职';

总结:
脚本生成后,只需做少量调整和添加少量外键即可。
数据库建表命名虽然需要见名知义。但面对上述纯体力劳动。本人认为采用反规范命名是没问题的,原因如下:
1 字段足够多。形成了一种整体的命名风格一致性。
2 能使用生成工具,生成表,建表,再拿表生成代码和文档,美美的节省大量时间。
3 前端调用方便。前端可直接用excel文档绑定数据。根据拼音命名规则可直接获取到字段key。
4 能多出很多摸鱼时间,这点是最重要的。谁没事去1000个多字段一个个查有道词典命名。那是初级小白才会做的事。是吧。哈哈


良心过不去。还是一个个命下名吧。顺便核对一下字段类型和长度,改脚本比建脚本还是轻松点,哈哈

在这里插入图片描述

美滋滋,一周的活一小时干完了,嘻嘻,卷死后端,干死前端,哈哈
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1823556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吴恩达2022机器学习专项课程C2W3:2.25 理解方差和偏差(诊断方差偏差正则化偏差方案搭建性能学习曲线)

目录 引言名词替代影响模型偏差和方差的因素1.多项式阶数2.正则化参数 判断是否有高偏差或高方差1.方法一&#xff1a;建立性能基准水平2.方法二&#xff1a;建立学习曲线 总结 引言 机器学习系统开发的典型流程是从一个想法开始&#xff0c;然后训练模型。初次训练的结果通常…

java:spring使用【@ImportResource】导入一个xml里面定义的bean

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89434148 # 项目代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…

220v转3v用多大电阻

在设计一个电压转换电路&#xff0c;将220V交流&#xff08;AC&#xff09;电压转换为3V直流&#xff08;DC&#xff09;电压时&#xff0c;我们需要考虑几个关键因素&#xff0c;包括安全、效率和电路的稳定性。AH8651是一款DC-DC转换器&#xff0c;通常用于将较高的输入电压转…

测试 halcon measure_projection 算子

期望结果完全相同&#xff0c;但是下面的测试结果和halcon的差值如下: [0.132838, 0.231991, 0.265157, 0.296903, 0.0998573, 0.165907, 0.230686, 0.130266, 0.0977104, 0.197109, 0.198173, 0.197086, 0.190943, 0.177665, 0.163521, 0.146541, 0.161362, 0.166666, 0.2281…

【GIS矢量切片】tippecanoe在Windows和CentOS中的安装

组件安装记录 背景介绍Windows下安装1、下载工具2、存放安装包3、进入DOS终端4、在终端执行命令5、下载程序6、放置源码7、修改配置信息8、编译9、测试10、参数说明瓦片输出瓦片描述和权属信息输入文件和图层名输入文件的并行处理输入文件的投影缩放级别瓦片分辨率CentOS 7安装…

图像的几何变换之平移

文章目录 前言需求代码运行结果图 前言 图像的几何变换是一个再基础不过的知识点&#xff0c;包括等距变换&#xff0c;相似变换&#xff0c;仿射变换和投影变换。图像的几何变换是指对图像的位置&#xff0c;尺寸&#xff0c;大小&#xff0c;形状和投影进行变换&#xff0c;…

Character Region Awareness for Text Detection论文学习

​1.首先将模型在Synth80k数据集上训练 Synth80k数据集是合成数据集&#xff0c;里面标注是使用单个字符的标注的&#xff0c;也就是这篇文章作者想要的标注的样子&#xff0c;但是大多数数据集是成堆标注的&#xff0c;也就是每行或者一堆字体被整体标注出来&#xff0c;作者…

AI对齐研究方法:建立一个足够对齐的人工智能系统,可以帮助我们解决所有其他对齐问题。 AI安全

与人类价值观保持一致&#xff0c;并遵循人类的意图。 找到一个无限可扩展的解决方案可能非常困难。相反&#xff0c;我们的目标是一种更务实的方法&#xff1a;建立和调整一个系统&#xff0c;该系统可以比人类更快、更好地调整研究进展。 使通用人工智能&#xff08;AGI&am…

2024年社会发展与城市规划国际会议(SDUP 2024)

2024年社会发展与城市规划国际会议&#xff08;SDUP 2024&#xff09; 2024 International Conference on Social Development and Urban Planning 【重要信息】 大会地点&#xff1a;杭州 大会官网&#xff1a;http://www.iacsdup.com 投稿邮箱&#xff1a;iacsdupsub-conf.co…

灾备建设中虚拟机细粒度恢复的含义及技术使用

灾备建设中为了考虑虚拟机恢复的效率与实际的用途&#xff0c;在恢复上出了普通的恢复虚拟机&#xff0c;也有其余的恢复功能&#xff0c;比如瞬时恢复&#xff0c;细粒度恢复等。这里谈的就是细粒度恢复。 首先细粒度恢复是什么&#xff0c;这个恢复可以恢复单个备份下来的文…

HCIA-Datacom H12-811 题库

LDP 邻居发现有不同的实现机制和规定&#xff0c;下面关于LDP 邻居发现的描述错误的是&#xff1a; A&#xff1a;LDP发现机制包括LDP基本发现机制和LDP扩展发现机制 B&#xff1a;LDP基本发现机制可以自动发现直连在同条链路上的LDP Peers C&#xff1a;LDP扩展发现机制够发现…

Golang:使用时会遇到的错误及解决方法详解

Go语言使用时常常会遇到的一些错误及解决方法&#xff0c;文中的示例代码讲解详细&#xff0c;感兴趣的小伙伴可以了解一下 1、go: go.mod file not found in current directory or any parent directory go mod init name 2、Failed to build the application: main.go:4:2:…

请求headers处理

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 有时在请求一个网页内容时&#xff0c;发现无论通过GET或者是POST以及其他请求方式&#xff0c;都会出现403错误。产生这种错误是由于该网页为了防止…

基于Pytorch框架的深度学习ConvNext神经网络宠物猫识别分类系统源码

第一步&#xff1a;准备数据 12种宠物猫类数据&#xff1a;self.class_indict ["阿比西尼猫", "豹猫", "伯曼猫", "孟买猫", "英国短毛猫", "埃及猫", "缅因猫", "波斯猫", "布偶猫&q…

ARM单片机使用CAN总线部署BootLoader

1.引言 1.1.单片机开发BootLoader意义 单片机开发BootLoader的原因主要与其在嵌入式系统中的关键作用有关。BootLoader是硬件启动的引导程序&#xff0c;它在操作系统内核或用户应用程序运行之前执行。以下是单片机开发BootLoader的主要原因&#xff1a; 初始化硬件设备&…

2024年春季学期《算法分析与设计》练习13

A:菱形图案 题目描述 KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的菱形图案。 输入 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;。 输出 针对每行输入&#xff0c;输出用“*”组成的菱形&#xff0c;…

Java 18新特性概览与解读

随着技术的不断进步&#xff0c;Java作为最流行的编程语言之一&#xff0c;也在持续地进行版本更新&#xff0c;为开发人员提供更强大、更高效的工具和特性。Java 18作为最新的稳定版本&#xff0c;引入了一系列引人注目的新特性和改进。以下是对Java 18中一些主要新特性的详细…

Petalinux由于网络原因产生的编译错误(3)-qemu-xilinx-system-native 失败

1 获取qemu-xilinx-system-native 失败 编译时遇到qemu-xilinx-system-native 包获取失败&#xff0c;如下图所示&#xff1a; 解决这种错误方法如下&#xff1a; 进入Petalinux 工程&#xff0c;编辑工程下的 project-spec/meta-user/conf/petalinuxbsp.conf 文件&#xff0…

什么是DMZ?路由器上如何使用DMZ?

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 DMZ 📒🚀 DMZ的应用场景💡 路由器设置DMZ🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 在网络管理中,DMZ(Demilitarized Zone,隔离区)是一个特殊的网络区域,常用于将公共访问和内部网络隔离开来。DMZ功能允许…

关联规则延伸之协同过滤

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、协同过滤1、含义2、策略 二、基于用户的协同过滤1、寻找相似偏好的用户2、欧式距离及系数3、皮尔逊系数4、其他系数5、算法步骤6、局限性 三、基于物品的协同过滤1、…