package com.allinpay.its.generator.sql; import java.io.FileInputStream; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; /** * <pre> * 如果有任何对代码的修改,请按下面的格式注明修改的内容. * 序号 时间 作者 修改内容 * 1. 2012-3-23 zl created this class. * </pre> */ public class GenerateInsertSql { public static final String paraFile = "e://Trans_Parameter.xls"; public static final String rn = "\n";//File.separator; /** * @param args */ public static void main(String[] args) { //due to poi version limit, not support excel file xlsx List<String> metas = new ArrayList<String>(); //meta should be formated as: sheetName:tableName#columnName:columnType,columnName1:columnType2 //columnType default is string if you don't give //channel meta metas.add("Channel:gw_trans_channel#CHANNEL_ID:int,NAME,ALIAS_NAME,ORG_ID,MERCHANT_ID,MERCHANT_ACCT,PUBLIC_KEY_PATH,PRIVATE_KEY_PATH,PRIVATE_KEY_PASSWORD,ORG_PUBLIC_KEY_PATH,CONF_PATH,CHECK_FILE_PATH,STATE,TYPE,DESCRIPTION,CREATE_DATETIME:datetime,CREATE_OPERATOR,LAST_UPDATE_DATETIME:datetime,LAST_UPDATE_OPERATOR"); //connect meta metas.add("Connect:gw_trans_connect#CONNECT_ID:int,NAME,STATE,CHANNEL_ID:int,TRANSACTION_TYPE:int,INTERACT_TYPE,TIMEOUT:int,MSG_FORMAT,MSG_TYPE,TRANSACTION_URL,MSG_TEMPLATE,MSG_CHARSET,SEND_METHOD,TARGET_TYPE,CREATE_DATETIME:datetime,CREATE_OPERATOR,LAST_UPDATE_DATETIME:datetime,LAST_UPDATE_OPERATOR"); //parameter meta metas.add("Parameter:gw_trans_conn_para#PARAMETER_ID:int,CONNECT_ID:int,TRANSACTION_STAGE,,PARAMETER_NAME,DEFAULT_PARAMETER_VALUE,VARIABLE_NAME,MAPPING_TYPE,ENCRYPTION_SEQUENCE:int,CREATE_DATETIME:datetime,CREATE_OPERATOR,LAST_UPDATE_DATETIME:datetime,LAST_UPDATE_OPERATOR"); //variable_map meta metas.add("VarMap:gw_mapping_variable#ROW_ID:int,CHANNEL_ID,TRANSACTION_TYPE:int,VAR_NAME,CNL_VAR_VALUE,ITS_VAR_VALUE,CREATE_DATETIME:datetime,CREATE_OPERATOR,LAST_UPDATE_DATETIME:datetime,LAST_UPDATE_OPERATOR"); //retcode_map meta metas.add("RetCodeMap:gw_mapping_ret_code#ROW_ID:int,CHANNEL_ID,TRANSACTION_TYPE:int,CNL_RET_CODE,CNL_RET_MSG,ITS_RET_CODE,ITS_RET_MSG,TRANS_STATE:int,TYPE,CREATE_DATETIME:datetime,CREATE_OPERATOR,LAST_UPDATE_DATETIME:datetime,LAST_UPDATE_OPERATOR"); //store meta data Map<String,String[]> metaData = new LinkedHashMap<String,String[]>(); for(String meta:metas) { metaData.put(meta.split("#")[0], meta.split("#")[1].split(",")); } try { HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(paraFile));//load excel for(String key: metaData.keySet()) {//loop to process String[] tmp = key.split(":");//sheetName:tableName HSSFSheet sheet = workbook.getSheet(tmp[0]);//get sheet according sheetName System.out.print( "-- Insert SQL for table " + tmp[1] + rn + //"delete from " + tmp[1] + ";" + rn + gen(tmp[1],sheet, metaData.get(key)));//generate SQL and print } } catch(Exception e) { e.printStackTrace(); } } /** * generate inset sql from excel sheet * @param tableName * @param sheet * @param meta * @return */ private static String gen(String tableName, HSSFSheet sheet, String[] meta) { StringBuilder buf = new StringBuilder(); buf.append("insert into "+tableName+"("); int rowCount = sheet.getLastRowNum() + 1; String[] columnNames = new String[meta.length]; String[] columnTypes = new String[meta.length]; String[] tmp; //get table columns' names and types for(int i=0; i<meta.length; i++) { if("".equals(meta[i].trim())) { columnNames[i] = null; columnTypes[i] = null; continue; } tmp = meta[i].split(":"); buf.append(tmp[0]).append(","); columnNames[i] = tmp[0]; columnTypes[i] = tmp.length>1?tmp[1]:null; } buf.replace(buf.length()-1, buf.length(), ") values("); String sqltmp = buf.toString(); buf.setLength(0); for (int i = 1; i < rowCount; i++) { HSSFRow row = sheet.getRow(i); buf.append(sqltmp); for(int j=0; j<meta.length; j++) { if(columnNames[j] == null) { continue; } HSSFCell cell = row.getCell(j); if (null != cell) { if("int".equals(columnTypes[j])) { buf.append(cell.toString().split("\\.")[0]+","); } else { //System.out.println(columnNames[j]+" "+(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC)); buf.append("'"+cell.toString()+"',"); } } else { if("datetime".equals(columnTypes[j])){ buf.append("sysdate,"); } else { buf.append("null,"); } } } buf.replace(buf.length()-1, buf.length(), ");"+rn); } return buf.toString(); } }