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
固然其中的字段位置和字段名稱是能夠替換的,CHINESS_COLUMN_MAP和getColumnMap就是爲了處理這個事情,可是必須做爲第一行。固然也可根據本身的需求修改一下代碼。apache
注意:爲了兼容2003及之前使用的是WorkbookFactory.create注意看下面的maven依賴app
<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>