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

如下需求:一个复杂的统战系统,用户信息字段总共有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个多字段一个个查有道词典命名。那是初级小白才会做的事。是吧。哈哈


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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数组】【快慢双指针】删除有序数组中的重复项+移除元素+删除有序数组中的重复项II

今天趁热打铁&#xff0c;接着刷了几道标签是【数组】的题&#xff0c;基本都是双指针就能解决。 1、删除有序数组中的重复项 该题对应力扣网址 class Solution { public:int removeDuplicates(vector<int>& nums) {int i,j;int count 0;int n nums.size();nums.…

vue3+ Element-Plus 点击勾选框往input中动态添加多个tag

实现效果&#xff1a; template&#xff1a; <!--产品白名单--><div class"con-item" v-if"current 0"><el-form-item label"平台名称"><div class"contaion" click"onclick"><!-- 生成的标签 …

下载NVIDIA官网的培训视频,生成中文字幕和PPT

下载NVIDIA官网的培训视频,生成中文字幕和PPT 一.[视频网站](https://www.nvidia.cn/on-demand/session/gtc24-s62129/)二.如何获取视频的原始链接三.下载视频的脚本【生成output.mp4】四.安装whisper环境【语音识别生成英文字幕】五.下载whisper模型六.生成英文字幕【输出merg…

解决微调后的模型导入ollama后出现”胡言乱语“情况

解决微调后的模型导入ollama后出现”胡言乱语“情况 先说结论&#xff0c;出现该问题的原因主要是因为Modelfile文件没有配置好。 这个是ModelFile文件的配置&#xff0c;第一行的from为要用的模型地址。 # sets the temperature to 1 [higher is more creative, lower is mo…

陪诊小程序开发,陪诊师在线接单

近几年&#xff0c;陪诊师成为了一个新兴行业&#xff0c;在科技时代中&#xff0c;陪诊小程序作为互联网下的产物&#xff0c;为陪诊市场带来了更多的便利。 当下生活压力大&#xff0c;老龄化逐渐严重&#xff0c;年轻人很难做到陪同家属看病。此外&#xff0c;就诊中出现了…

Vue3项目中Pinia使用详解

开篇 本文的目的是创建一个使用typescript的vue3项目&#xff0c;并使用pinia来管理状态。 详细步骤 创建项目 创建vue3项目&#xff0c;并使用vite作为打包工具 npm create vitelatest vue3_pinia // 选择vue,随后选择typesript进入项目&#xff0c;并按照依赖包 cd vue3_…

植物大战僵尸(杂交版)最新版V2.1来袭!

【新手指导】最新版v2.1来袭 1.闪退怎么办&#xff1f; 答:窗口模式可以解决大部分问题。输入法转换成英文也可以。最后一种办法管理员运行&#xff0c;再后台可运行&#xff0c;即便不是窗口也不会闪退&#xff0c;亲测有效 2.哪里下载&#xff1f; 答&#xff1a;夸克网盘htt…

OrangePi AIpro测评:性能、应用与开发者体验解析

一、OrangePi AIpro介绍 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&#xff0c;支持双4K高…

学习ZYNQ——使用IP核

文章目录 [TOC](文章目录) 前言一、新建Vivado工程二、使用IP核1.加载IP2.查看IP核3.应用IP核 三、添加源文件1.led.v2.约束文件pin_led.xdc 四、综合、运行程序 前言 加载前面使用HLS生成的IP核&#xff0c;实现LED灯的闪烁&#xff0c;熟悉整套流程的步骤&#xff1a; 前一篇…

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…

NAND flash测试-雷龙发展

文章目录 一、简介 二、速度测试 最近比较忙&#xff0c;也一直没空发什么文章&#xff0c;这算是新年第一篇吧&#xff0c;正好最近收到了一个雷龙的flash芯片&#xff0c;先拿来玩一下吧。 有兴趣的小伙伴可以去雷龙官网找小姐姐领取一个免费试用。 一、简介 大概样子就是上面…

大模型企业落地:汽车行业知识大模型应用

前言 在当今这个信息爆炸的时代&#xff0c;知识管理成为了企业提升核心竞争力的关键。特别是在汽车行业这样一个技术密集、信息量庞大的领域&#xff0c;如何高效管理和利用知识资源&#xff0c;成为了每个企业必须面对的挑战。 汽车行业的知识管理痛点 汽车行业作为现代工…

RCD负载箱:电力系统的安全保障

在电力系统中&#xff0c;负载箱是一种重要的设备&#xff0c;它的主要功能是模拟实际的电力负载&#xff0c;以便对电力系统进行各种性能测试和分析。RCD负载箱一种特殊类型的负载箱&#xff0c;它具有剩余电流保护功能&#xff0c;可以有效地防止电气火灾和电击事故的发生&am…

基于Spring Boot的智能分析平台

项目介绍&#xff1a; 智能分析平台实现了用户导入需要分析的原始数据集后&#xff0c;利用AI自动生成可视化图表和分析结论&#xff0c;改善了传统BI系统需要用户具备相关数据分析技能的问题。该项目使用到的技术是SSMSpring Boot、redis、rabbitMq、mysql等。在项目中&#…

工业 UI 风格,展现独特魅力

工业 UI 风格&#xff0c;展现独特魅力

Facebook:数字时代的文化交流平台

在当今信息爆炸的数字时代&#xff0c;Facebook已经成为了一个不可或缺的社交媒体平台&#xff0c;不仅在个人生活中起到了联系社交的作用&#xff0c;更在全球范围内促进了文化交流和理解。本文将深入探讨Facebook作为文化交流平台的重要性&#xff0c;并分析其在数字时代如何…

C++面向对象程序设计 - 命名空间

命名空间是ANSI C引入的可以由用户命名的作用域&#xff0c;用来处理程序中常见的同名冲突。 在C语言中定义了三个层次的作用域&#xff0c;即文件&#xff08;编译单元&#xff09;、函数和复合语句。C又引入了类作用域&#xff0c;类是出现在文件内的。在不同的作用域中可以定…

vue代办事件案例实战练习,配有答案解析

代办事件案例 该案例&#xff0c;综合了前面所学的知识&#xff0c;列入点击事件绑定&#xff0c;双向绑定&#xff0c;v-for循环语句&#xff0c;v-model双向绑定&#xff0c;以及input标签的不同type形式。 演示代码如下&#xff1a; <template > <div id"ku…

腾讯云对象存储不绑定自定义备案域名不给下载应该如何处理?

从2024年1月1日起&#xff0c;腾讯云对象存储&#xff08;COS&#xff09;将实施新政策&#xff1a;新创建的存储桶不再支持使用path-style域名&#xff08;即存储桶绝对路径&#xff09;。此外&#xff0c;使用默认域名访问的新存储桶将不再支持任意类型文件的预览&#xff0c…