Mysql根据Excel表格生成DDL

package com.yieldchain.reg;

import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import org.junit.Test;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MysqlDDLUtilTest {
    private static final String fileName = "template/PeriodicReportQuarter.xlsx";
    @Test
    public void test(){
        ExcelReader reader = ExcelUtil.getReader(fileName);
        StringBuilder sql = new StringBuilder();
        //以下生成建表Sql
        sql.append("create table ").append("reg_" + "periodic_report_quarter").append("(");
        sql.append("\n");
        sql.append("    `id` bigint NOT NULL COMMENT 'id',");
        sql.append("\n");
        Set<String> fields = new HashSet<String>();
        List<String> longColumn = new ArrayList<>();

        List<List<Object>> readAll = reader.read();
        for(List<Object> list : readAll)    {
            String columnDesc = (String) list.get(0);
            String column = (String) list.get(1);
            if(ObjectUtils.isEmpty(column)){
                continue;
            }
            if(fields.contains(column.trim())){
                continue;
            }
            String length = String.valueOf(list.get(2));
            if(ObjectUtils.isEmpty(length)){
                continue;
            }
            String desc = String.valueOf(list.get(3));

            //处理超长字段,处理方式截取,首先截取后60个字符,如果有重复,则截取前60个字符,再重复则报错
            if(column.length() > 64){
                String columnTem = column.substring(column.length() - 60);
                if(longColumn.contains(columnTem)){
                    columnTem = column.substring(0, 59);
                }
                if(longColumn.contains(columnTem)){
                    throw new IllegalArgumentException(column + "is not a valid");
                }
                column= columnTem;
                longColumn.add(columnTem);
            }

            sql.append("    ").append(column).append(" ");
            if(length.contains(",") || length.contains(",")){
                length = length.replace(",",",");
                sql.append("decimal("+length+") NOT NULL COMMENT '" +columnDesc + "'");
            }else if(desc.contains("整数")){
                if("20".equals(length)){
                    sql.append("bigint NOT NULL COMMENT '"+columnDesc+"'");
                }else{
                    sql.append("int NOT NULL COMMENT '"+columnDesc+"'");
                }

            }
            else{
                if(desc.contains("必填") && !desc.contains("时必填")){
                    sql.append("VARCHAR("+length+") NOT NULL COMMENT '" + columnDesc + "'");
                }else {
                    sql.append("VARCHAR("+length+") DEFAULT NULL COMMENT '" + columnDesc + "'");
                }
            }
            sql.append(",");
            sql.append("\n");
            fields.add(column);


        }
        sql.append("    `create_time` datetime NULL DEFAULT NULL,");
        sql.append("\n");
        sql.append("    `create_user` bigint NULL DEFAULT NULL,");
        sql.append("\n");
        sql.append("    `update_time` datetime NULL DEFAULT NULL,");
        sql.append("\n");
        sql.append("    `update_user` bigint NULL DEFAULT NULL,");
        sql.append("\n");
        sql.append("    PRIMARY KEY (`id`) USING BTREE");
        //sql.delete(sql.lastIndexOf(","), sql.length());
        sql.append("\n)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");
        System.out.println(sql);


    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值