最近一個哥哥給我出了一個題目:用POI把Excle表的數據插入到數據庫中。
下面是我做的:
明確兩點。1.讀取Excel表的數據
2.連接數據庫(Oracle)并插入數據
1。首先Maven導包:我是從csdn下的,然后用 mvn install:install-file -Dfile= -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar 命令將包導入本地Maven倉庫。
2。第二步連接數據庫:也是從csdn下的Oracle的數據源用Maven命令導入本地倉庫
下面是連接數據并插入數據的相關代碼:
public class DBHelper { PRivate Connection conn = null; private PreparedStatement pstmt = null; private ResultSet rs = null; static{ try{ //加載MySQL的驅動類 Class.forName("oracle.jdbc.driver.OracleDriver") ; }catch(ClassNotFoundException e){ System.out.println("找不到驅動程序類 ,加載驅動失??!"); e.printStackTrace() ; } } public Connection getConnection(){ try {// DataSource dataSource=(DataSource)BasicDataSourceFactory.createDataSource(Env.getInstance());// Context context=new InitialContext();// DataSource dataSource=(DataSource)context.lookup("java:comp/env/jdbc/orcl"); conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl" , "wb" , "a" ) ; } catch (Exception e) { e.printStackTrace(); } return conn; } /** * 字符轉換 * * @param pstmt * * @param params * * @throws SQLException */ public void setValue(PreparedStatement pstmt, List<Object> params) throws SQLException { // 字符轉換 if (params != null && params.size() > 0) { Object obj = null; String type = ""; for (int i = 0; i < params.size(); i++) { obj = params.get(i); if (obj != null) { type = obj.getClass().getName(); if ("[B".equals(type)) { pstmt.setBytes(i + 1, (byte[]) obj); } else { pstmt.setString(i + 1, String.valueOf(obj)); } } else { pstmt.setString(i + 1, String.valueOf(obj)); } } } } /** * 更新數據 * * @param sql * * @param params * * @return */ public int update(String sql, List<Object> params) { int result = 0; try { conn = this.getConnection(); pstmt = conn.prepareStatement(sql);//預處理 this.setValue(pstmt, params); result = pstmt.executeUpdate(); // 執行sql語句 } catch (SQLException e) { e.printStackTrace(); } return result; }3.連接數據庫成功后,就是用Apache軟件基金會的開放源碼函式庫,也就是POI來讀取Excle表格的數據:代碼如下:
package com.jjz.util;import java.io.FileInputStream;import java.io.IOException;import java.util.Iterator;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class Ddl { private Workbook wb; private FileInputStream fis; private DBHelper db ; public Workbook createWorkbook(String filePath) throws IOException{ if(filePath != null){ fis = new FileInputStream(filePath); if(filePath.endsWith(".xls")){ //2003版本的excel,用.xls結尾 wb = new HSSFWorkbook(fis);//得到工作簿 }else if(filePath.endsWith(".xlsx")){ //2007版本的excel,用.xlsx結尾 wb = new XSSFWorkbook(fis);//得到工作簿 }else{ } return wb; } return null; } /** * 第一種遍歷方式:純粹的for循環 * @param wbk */ public void insert2DataBase(Workbook wbk){ db = new DBHelper(); StringBuffer sql; if(wbk != null){ Sheet sheet = wbk.getSheetAt(0); Row row; Cell cell = null; if(sheet != null){ for(int i = 1; i < sheet.getPhysicalNumberOfRows(); i ++){ sql = new StringBuffer("insert into test (Tid, Tname) values "); row = sheet.getRow(i); String bh = ""; String xm = ""; for(int j = 0; j < row.getPhysicalNumberOfCells(); j ++){ cell = row.getCell(j); switch(cell.getCellType()){ case HSSFCell.CELL_TYPE_NUMERIC: // 數字 sql.append("(").append( String.valueOf((int)cell.getNumericCellValue()) ).append(","); bh = String.valueOf((int)cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_STRING: // 字符串 sql.append("'").append( cell.getStringCellValue() ).append("')"); xm = cell.getStringCellValue(); break; /*case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean cellValue = cell.getBooleanCellValue() + ""; break; case HSSFCell.CELL_TYPE_FORMULA: // 公式 cellValue = cell.getCellFormula() + ""; break; case HSSFCell.CELL_TYPE_BLANK: // 空值 cellValue = ""; break; case HSSFCell.CELL_TYPE_ERROR: // 故障 cellValue = "非法字符"; break; */ default: break; } } int result = db.update(sql.toString(), null); if(result > 0){ System.out.println("數據插入成功:" + sheet.getRow(0).getCell(0).toString()+ "=" + bh + "," + sheet.getRow(0).getCell(1).toString() + "=" +xm); } } } } } /** * 換一種遍歷方式 * @param wb */ public void doSomething(Workbook wb){ if(wb != null){ Sheet sheet; Row row; //一個工作簿可能不止一個sheet表格 for(int i = 0; i < wb.getNumberOfSheets(); i ++){ sheet = wb.getSheetAt(i); //循環遍歷每個sheet表的沒行數據 for(int j = 1; j < sheet.getPhysicalNumberOfRows(); j ++){ row = sheet.getRow(j); //用迭代遍歷,因為我看見它有一個iterator()方法 for(Iterator<Cell> cell = row.iterator(); cell.hasNext() ;){ System.out.print( cell.next().toString() + " "); } System.out.println(); } } } }}4.兩部合并,謝了測試代碼:package com.jjz.poi;import java.io.IOException;import org.apache.poi.ss.usermodel.Workbook;import com.jjz.util.Ddl;public class WbTest { public static void main(String[] args) { Ddl ddl = new Ddl(); Workbook wb = null; try { wb = ddl.createWorkbook("C://Users//Administrator//Desktop//test.xls"); } catch (IOException e) { e.printStackTrace(); } if(wb != null){ ddl.insert2DataBase(wb); ddl.doSomething(wb); } } }發現數據庫中插入了數據:
控制臺輸出了如下數據:
發現可行。
總結:
個人發現這樣寫有很大的一個弊端就是插入數據的時候,每讀取一行數據就把它插入到數據庫。這樣要頻繁寫重復的sql語句去的跟新(插入)數據庫。麻煩(因為不是MySql數據庫)??梢詫懸粋€事務,一次性插入,要么成功,要么失敗后回滾。還有一點就是對于數據的處理可以寫一個People類,表格中的第一和第二兩列的屬性作為它的變量,有點像Springmvc從jsp頁面傳對象過來一樣,用它來傳值。不知道行不行,QAQ??傊@一段程序缺點多多。
新聞熱點
疑難解答