從Excel導出SQL

工具代碼簡介

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class ExcelToSql {

    private static final Logger logger = LoggerFactory.getLogger(ExcelToSql.class);

    private static HashMap<String,Integer> DEFAULT_COLUMN_MAP;

    private static HashMap<String,String> CHINESS_COLUMN_MAP;

    public static final String CREATE_TABLE_PROMPT = "CREATE TABLE ";

    /**
     * 字段名稱
     */
    public static final String CNAME = "CNAME";

    /**
     * 字段描述 註釋
     */
    public static final String COMMENT = "COMMENT";

    /**
     * 字段類型
     */
    public static final String CTYPE = "CTYPE";

    /**
     * 非空
     */
    public static final String NOTNULL = "NOTNULL";

    /**
     * 默認值
     */
    public static final String DEFAULT = "DEFAULT";

    /**
     * 索引值
     */
    public static final String INDEX = "INDEX";

    static {
        DEFAULT_COLUMN_MAP = new HashMap<String, Integer>(6);
        DEFAULT_COLUMN_MAP.put(CNAME,0);
        DEFAULT_COLUMN_MAP.put(COMMENT,1);
        DEFAULT_COLUMN_MAP.put(CTYPE,2);
        DEFAULT_COLUMN_MAP.put(NOTNULL,3);
        DEFAULT_COLUMN_MAP.put(DEFAULT,4);
        DEFAULT_COLUMN_MAP.put(INDEX,5);
        CHINESS_COLUMN_MAP = new HashMap<String, String>(6);
        CHINESS_COLUMN_MAP.put("字段名稱",CNAME);
        CHINESS_COLUMN_MAP.put("字段描述",COMMENT);
        CHINESS_COLUMN_MAP.put("字段類型",CTYPE);
        CHINESS_COLUMN_MAP.put("不爲空",NOTNULL);
        CHINESS_COLUMN_MAP.put("缺省值",DEFAULT);
        CHINESS_COLUMN_MAP.put("索引類型",INDEX);
    }

    public static void main(String [] args){
        final InputStream is = ExcelToSql.class.getResourceAsStream("/db.xlsx");
        Workbook wb = null;
        try {
            wb = WorkbookFactory.create(is);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
//        System.out.println(wb.getNumberOfSheets());//表單sheet數量
        final Sheet sheet = wb.getSheetAt(0);
        excelToSql(sheet);
    }



    private static String excelToSql(Sheet sheet){
        final String sheetName = sheet.getSheetName();
        return excelToSql(sheet,sheetName);
    }

    private static String excelToSql(Sheet sheet,String tableName){
        final int nums = sheet.getLastRowNum();
        final String sheetName = sheet.getSheetName();
        if(nums < 1){
            logger.info(sheetName + "爲空");
            throw new RuntimeException("表單爲空");
        }
        final StringBuffer sb = new StringBuffer(CREATE_TABLE_PROMPT);
        final StringBuffer index = new StringBuffer();
        sb.append(tableName);
        sb.append("(");
        final Map<String, Integer> columnMap = getColumnMap(sheet);
        for(int i=1;i<nums;i++){
            final Row row = sheet.getRow(i);
            Cell cell = row.getCell(columnMap.get(CNAME));
            String cname;
            String column = cname = cell.getStringCellValue();
            sb.append(column);
            sb.append(" ");

            cell = row.getCell(columnMap.get(CTYPE));
            column = cell.getStringCellValue();
            sb.append(column);

            cell = row.getCell(columnMap.get(INDEX));
            column = cell.getStringCellValue();
            if(StringUtils.isNotBlank(column)){
                sb.append(" ");
                if("主鍵".equals(column)){
                    sb.append("PRIMARY KEY");
                }else if("自增主鍵".equals(column)){
                    sb.append("PRIMARY KEY AUTO_INCREMENT");
                }else if("普通索引".equals(column)){
                    String indexName = "idx_"+cname.toLowerCase();
                    index.append("create index " + indexName + " on "+ tableName + "(" + cname + ");");
                    index.append("\n");
                }else if("惟一索引".equals(column)){
                    String indexName = "idx_"+cname.toLowerCase();
                    index.append("create unique index  " + indexName + " on "+ tableName + "(" + cname + ");");
                    index.append("\n");
                }
            }

            cell = row.getCell(columnMap.get(NOTNULL));
            column = cell.getStringCellValue();
            if("Y".equalsIgnoreCase(column) || "YES".equalsIgnoreCase(column)){
                sb.append(" NOT NULL");
            }
            cell = row.getCell(columnMap.get(DEFAULT));
            final int cellType = cell.getCellType();
            double numericCellValue;
            if(Cell.CELL_TYPE_NUMERIC == cellType) {
                numericCellValue = cell.getNumericCellValue();
                sb.append(" DEFAULT ");
                sb.append(numericCellValue);
            }
            else {
                column = cell.getStringCellValue();
                if (StringUtils.isNotBlank(column)) {
                    sb.append(" DEFAULT ");
                    sb.append(column);
                }
            }
            cell = row.getCell(columnMap.get(COMMENT));
            column = cell.getStringCellValue();
            if(StringUtils.isNotBlank(column)){
                sb.append(" COMMENT '");
                sb.append(column.trim());
                sb.append("'");
            }
            sb.append(",");
        }
        sb.setCharAt(sb.length()-1,')');
        sb.append(";");
        sb.append("\n");
        sb.append(index);
        final String result = sb.toString().toUpperCase();
        System.out.println(result);
        return result;
    }

    private static Map<String,Integer> getColumnMap(Sheet sheet){
        final int nums = sheet.getLastRowNum();
        final String sheetName = sheet.getSheetName();
        if(nums <= 1){
            logger.info(sheetName + "爲空");
            return DEFAULT_COLUMN_MAP;
        }
        final Row row = sheet.getRow(0);
        final int cellNums = row.getPhysicalNumberOfCells();
        assert  cellNums == 6;
        final HashMap<String, Integer> result = new HashMap<String, Integer>();
        for(int i = 0;i<cellNums;i++){
            final String stringCellValue = row.getCell(i).getStringCellValue();
            result.put(CHINESS_COLUMN_MAP.get(stringCellValue),i);
        }
        return result;
    }
}

工具只處理了6個部分:字段名稱,字段描述,字段類型,不爲空,缺省值,索引類型java

其中字段描述就是註釋,不爲空標誌字段是否能夠爲空能夠只處理了"YES"或"Y",缺省值就是默認值,索引類型是字段索引。自處理了"自增主鍵,普通索引,惟一索引"mysql

大概的Excel以下圖所示:sql

excel實例

固然其中的字段位置和字段名稱是能夠替換的,CHINESS_COLUMN_MAP和getColumnMap就是爲了處理這個事情,可是必須做爲第一行。固然也可根據本身的需求修改一下代碼。apache

注意:爲了兼容2003及之前使用的是WorkbookFactory.create注意看下面的maven依賴app

maven依賴

<dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.35</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
</dependency>
相關文章
相關標籤/搜索