Java Excel 导入到 Oracle 2013-07-30 #Excel #Java #Oracle Excel文件导入到Oracle数据库 首先这里的情况是针对一个excel文件里面的一个sheet导入到数据库的多张表。 设计一个配置(ExcelImportCon.java)类,能保证我传入的配置能够起作用: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; public class ExcelImportCon { //要插入的表名(TABLEi ,表名) private Map tableMap = new HashMap(); //要插入的栏位名(COLUMNi ,{栏位名,exl第几列数据 从0开始}) private Map columnMap = new HashMap(); //其他插入的隐藏栏位名(HIDDENi ,数组{栏位名,类型,值})/1 date ,2 String ,3 double,4 int,5 变量,6 SEQ private Map hiddenColMap = new HashMap(); private Map sequence = new HashMap(); /***********************************DBconfig*****************************************/ private String classString="oracle.jdbc.driver.OracleDriver"; private String username="ec1016"; private String password="password"; private String url="java:oracle:thin:@192.168.1.171:1521:htfdbweb"; private Connection conn=null; private PreparedStatement ps = null; private ResultSet rs = null; /****************************************************************************/ public Connection getConnection() { try { Class.forName(classString); conn = DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public Map getTableMap() { return tableMap; } public Map getColumnMap() { return columnMap; } public Map getHiddenColMap() { return hiddenColMap; } //拿到sequence,如果处在同一行,并且有,就拿以前的,如果不是以前的dataLine,就另取值 public String getSequence(String seqName,int dataLine) { return (String)sequence.get((seqName+"-"+dataLine))==null?getSeq(seqName,dataLine):(String)sequence.get((seqName+"-"+dataLine)); } public Map getSequenceMap() { return sequence; } public String getSeq(String seqName){ conn = getConnection(); String sql = ""; String resultSeq = ""; try { sql = "SELECT " + seqName + ".NEXTVAL FROM DUAL"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while(rs.next()){ resultSeq = rs.getString(1); } } catch (Exception e) { e.printStackTrace(); } finally { if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps != null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } return resultSeq; } public String getSeq(String seqName,int dataLine){ conn = getConnection(); String sql = ""; String resultSeq = ""; try { sql = "SELECT " + seqName + ".NEXTVAL FROM DUAL"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while(rs.next()){ resultSeq = rs.getString(1); this.sequence.put((seqName+"-"+dataLine), resultSeq); if(this.sequence.get((seqName+"-"+(dataLine-1)))!=null){ this.sequence.remove((seqName+"-"+(dataLine-1))); } } } catch (Exception e) { e.printStackTrace(); } finally { if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps != null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } return resultSeq; } /** * 拼装表列数 * @author Karl.luo at 2013-07-24 * @param i * @return */ public String buildCol(int i){ StringBuffer sqlBuffer = new StringBuffer(); sqlBuffer.append(" "); String[] columinfo = (String[]) this.getColumnMap().get(("COLUMN"+i)); for( int w=0, y=columinfo.length;w<y;w++){ sqlBuffer.append(columinfo[w]); if(w<y-1){ sqlBuffer.append(","); } } return sqlBuffer.toString(); } /** * 拼装表隐藏列 * @param i * @return */ public String buildHiddenCol(int i){ StringBuffer sqlBuffer = new StringBuffer(); sqlBuffer.append(" "); String[][] hiddenInfo = (String[][])this.getHiddenColMap().get(("HIDDEN"+i)); if(hiddenInfo != null){ if(hiddenInfo.length>0){ sqlBuffer.append(","); } for( int w=0, y=hiddenInfo.length;w<y;w++){ sqlBuffer.append(hiddenInfo[0][0]); if(w<y-1){ sqlBuffer.append(","); } } } sqlBuffer.append(") VALUES ( "); return sqlBuffer.toString(); } } 具体的拼装,导入类(ImportExcelFile.java) import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Timestamp; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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; /** * <p>Title:导入Excel到数据库</p> * <p>Description:读取Excel文件 </p> * <p>Copyright: Copyright (c) 2013</p> * <p>Company: </p> * @author Karl.luo * @version 1.0 * @CreateDate: 2013-07-23 * @UpdateDate: */ public class ImportExcelFile { private static final Log log = LogFactory.getLog(ImportExcelFile.class); public ImportExcelFile() { } private String classString="oracle.jdbc.driver.OracleDriver"; private String username="ec1016"; private String password="password"; private String url="java:oracle:thin:@192.168.1.171:1521:htfdbweb"; private Connection conn=null; private PreparedStatement ps = null; public Connection getConnection(){ try { Class.forName(classString); conn=DriverManager.getConnection(url,username,password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } /** * 得到存入数据库的结果 * @author Karl.luo at 2013-07-23 * @param filePath * @param tableStr * @param fieldStr * @return flag */ public String getSuccessFlag(ExcelImportCon test, String filePath){ //打印开始 log.debug("=======导入文件 "+ filePath +" 开始======"); System.out.println("=======导入文件 "+ filePath +" 开始======"); String result = ""; HSSFSheet sheet = null; Map sqlMap = new HashMap(); try { // //拿到拼装SQL Map集合 sqlMap = buildSql(test); if(sqlMap == null){ log.error("SQL拼装出错,为null"); System.out.println("SQL拼装出错,为null"); return "导入出错,配置excel文件错误"; } // 拿到第一个sheet sheet = getRowNo(filePath); if(sheet == null){ log.error("Excel文件没有可导入的数据"); return "Excel文件没有可导入的数据"; } conn = getConnection(); conn.setAutoCommit(false); //把sheet里的值塞进表,并commit result = setTableValue(sqlMap, sheet, ps, conn, test); conn.setAutoCommit(true); } catch (Exception e) { e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } } return result; } /** * 返回拼装好的SQL Map * @param test * @param columinfo * @param hiddenInfo * @return */ public Map buildSql(ExcelImportCon test){ Map sqlMap = new HashMap(); StringBuffer sqlBuffer; String[] columinfo; String[][] hiddenInfo; if (test != null && test.getTableMap() != null) { // 打印开始拼装SQL log.debug("========SQL拼装开始:========"); System.out.println("========SQL拼装开始:========"); // 拼装需要执行的sql语句 for (int i = 1, k = test.getTableMap().size(); i <= k; i++) { sqlBuffer = new StringBuffer(); sqlBuffer.append(" INSERT INTO "); sqlBuffer.append(test.getTableMap().get(("TABLE" + i))); sqlBuffer.append(" ( "); columinfo = (String[]) test.getColumnMap().get(("COLUMN" + i)); hiddenInfo = (String[][]) test.getHiddenColMap().get(("HIDDEN" + i)); // 拼装表列 sqlBuffer.append(test.buildCol(i)); // 拼装隐藏栏位 sqlBuffer.append(test.buildHiddenCol(i)); //处理空存在问题 int totalLength = 0; if(columinfo != null){ totalLength+= columinfo.length; } if(hiddenInfo != null){ totalLength+= hiddenInfo.length; } for (int w = 0, y = totalLength; w < y; w++) { sqlBuffer.append("?"); if (w < y - 1) { sqlBuffer.append(","); } } sqlBuffer.append(")"); //打印SQL i : = log.debug("SQL 第"+i+"条: " + sqlBuffer); System.out.println("SQL 第"+i+"条: " + sqlBuffer); sqlMap.put("SQL" + i, sqlBuffer.toString()); } } return sqlMap; } /** * 读取文件,拿到数据sheet * @author Karl.luo at 2013-07-25 * @param filePath * @return HSSFSheet */ private HSSFSheet getRowNo(String filePath){ // 打印开始拿到第一个sheet操作 FileInputStream fis = null; HSSFWorkbook workbook = null; HSSFSheet sheet = null; try { // 传入文件地址 fis = new FileInputStream(filePath); // 根据传入的文件流创建工作薄 workbook = new HSSFWorkbook(fis); // 拿到第一个sheet sheet = workbook.getSheetAt(0); } catch (Exception e) { e.printStackTrace(); } finally { if(fis != null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } return sheet; } /** * 传入sheet表值,并insert表和commit * @author Karl.luo at 2013-07-25 * @param totalRow * @param sqlMap * @param sheet * @param ps * @param conn * @param test * @throws SQLException */ private String setTableValue(Map sqlMap, HSSFSheet sheet, PreparedStatement ps, Connection conn, ExcelImportCon test) throws SQLException{ //开始导入数据 log.debug("=======开始导入数据========"); System.out.println("=======开始导入数据========"); HSSFRow row = null; HSSFCell cell = null; int totalRow = sheet.getLastRowNum(); String[] columinfo; //定义所需读的excel栏位 int noline = 0; int success = 0; int fail = 0; log.debug("=======正在导入数据中,请等待。。。========"); for (int j = 1; j <= totalRow; j++) { try { noline = 0; for (int i = 1, k = sqlMap.size(); i <= k; i++) { //System.out.println("sql:" + (String) sqlMap.get("SQL" + i)); ps = conn.prepareStatement((String) sqlMap.get("SQL" + i)); columinfo = (String[]) test.getColumnMap().get(("COLUMN" + i)); row = sheet.getRow(j); for (int w = 0, y = columinfo.length; w < y; w++) { cell = row.getCell((short) (w + noline)); switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC: //System.out.println("number:" + cell.getNumericCellValue()); ps.setString(w + 1, cell.getNumericCellValue() + ""); break; case HSSFCell.CELL_TYPE_STRING: //System.out.println("string:" + cell.getStringCellValue()); ps.setString(w + 1, cell.getStringCellValue() + ""); break; case HSSFCell.CELL_TYPE_BOOLEAN: //System.out.println("boolean:" + cell.getBooleanCellValue()); ps.setString(w + 1, cell.getBooleanCellValue() + ""); break; case HSSFCell.CELL_TYPE_FORMULA: //System.out.println("formula:" + cell.getCellFormula()); ps.setString(w + 1, cell.getCellFormula() + ""); break; case HSSFCell.CELL_TYPE_BLANK: ps.setString(w + 1, ""); break; default: //System.out.println("unsuported sell type"); break; } } //隐藏列set值 getClassType(ps, i, test, columinfo, j); ps.addBatch(); ps.executeBatch(); //每生成一条insert语句,就commit一次(大数据) conn.commit(); noline += columinfo.length; } success += 1; } catch (Exception e) { e.printStackTrace(); log.error("=======导入第"+j+"条失败========"); System.out.println("=======导入第"+j+"条失败========"); fail += 1; continue; } } log.debug("===========导入数据结束==========="); System.out.println("===========导入数据结束==========="); String result = "总共导入数据"+totalRow+"条,其中成功"+success+"条,失败"+fail+"条"; //打印 log.debug(result); System.out.println(result); return result; } /** * 根据传值类型做判断,分别进行set值 * @author Karl.luo at 2013-07-25 * @param ps * @param mapNo * @param test * @param columinfo * @param dataLine */ public void getClassType(PreparedStatement ps, int mapNo, ExcelImportCon test, String[] columinfo,int dataLine) { String[][] hiddenInfo = (String[][]) test.getHiddenColMap().get( ("HIDDEN" + mapNo)); for (int j = 0; j < hiddenInfo.length; j++) { switch (Integer.parseInt(hiddenInfo[0][1])) { case 1: //System.out.println("this is date!"); try { ps.setTimestamp(columinfo.length + j + 1, Timestamp.valueOf(hiddenInfo[0][2])); } catch (SQLException e1) { e1.printStackTrace(); } break; case 2: //System.out.println("this is string!"); try { ps.setString(columinfo.length + j + 1, hiddenInfo[0][2]); } catch (SQLException e1) { e1.printStackTrace(); } break; case 3: //System.out.println("this is double!"); try { ps.setDouble(columinfo.length + j + 1, Double.parseDouble(hiddenInfo[0][2])); } catch (SQLException e1) { e1.printStackTrace(); } break; case 4: //System.out.println("this is int!"); try { ps.setInt(columinfo.length + j + 1, Integer.parseInt(hiddenInfo[0][2])); } catch (SQLException e1) { e1.printStackTrace(); } break; case 5: //System.out.println("this is bianliang!"); try { //System.out.println("-------------"+dataLine); String seqVal = test.getSequence(hiddenInfo[0][2],dataLine); ps.setString(columinfo.length + j + 1, seqVal); } catch (SQLException e) { e.printStackTrace(); } break; case 6: //System.out.println("this is sequence!"); try { String seqVal = test.getSeq(hiddenInfo[0][2]); ps.setString(columinfo.length + j + 1, seqVal); } catch (SQLException e) { e.printStackTrace(); } break; default: System.out.println("没有相关类型!"); break; } } } public static void main(String[] args) { ImportExcelFile x = new ImportExcelFile(); String filePath = "D:/testDemo.xls"; ExcelImportCon test = new ExcelImportCon(); String[] colArr; test.getTableMap().put("TABLE1", "aaa"); colArr = new String[]{"test1","test2"}; test.getColumnMap().put("COLUMN1", colArr); String[][] hiddenArr = new String[1][3]; hiddenArr[0] = new String[]{"no","5","SEQ_AAANO"}; test.getHiddenColMap().put("HIDDEN1", hiddenArr); test.getTableMap().put("TABLE2", "bbb"); colArr = new String[]{"test3","test4","test5"}; test.getColumnMap().put("COLUMN2", colArr); hiddenArr[0] = new String[]{"no","5","SEQ_AAANO"}; //hiddenArr[0] = new String[]{"in","2","11111"}; //hiddenArr[0] = new String[]{"in","3","201.121}; //hiddenArr[0] = new String[]{"in","3","admin}; //hiddenArr[0] = new String[]{"in","1","20130717}; test.getHiddenColMap().put("HIDDEN2", hiddenArr); try { System.out.println(x.getSuccessFlag( test, filePath)); } catch (Exception e) { e.printStackTrace(); } } } Ps:通过Excel导入到多张表,excel里面的字段要按照在main函数里面的配置顺序来,这样存入数据库表的时候才不会出现问题。 骆林佳 Published under (CC) BY-NC-SA