国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

POI遍歷Excle表

2019-11-11 05:18:36
字體:
供稿:網(wǎng)友

最近一個哥哥給我出了一個題目:用POI把Excle表的數(shù)據(jù)插入到數(shù)據(jù)庫中。

下面是我做的:

明確兩點(diǎn)。1.讀取Excel表的數(shù)據(jù)

2.連接數(shù)據(jù)庫(Oracle)并插入數(shù)據(jù)

1。首先Maven導(dǎo)包:我是從csdn下的,然后用    mvn install:install-file -Dfile= -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar 命令將包導(dǎo)入本地Maven倉庫。

2。第二步連接數(shù)據(jù)庫:也是從csdn下的Oracle的數(shù)據(jù)源用Maven命令導(dǎo)入本地倉庫

   

下面是連接數(shù)據(jù)并插入數(shù)據(jù)的相關(guān)代碼:

public class DBHelper {	PRivate Connection conn = null;	private PreparedStatement pstmt = null;	private ResultSet rs = null;		static{		try{   	    //加載MySQL的驅(qū)動類   	    Class.forName("oracle.jdbc.driver.OracleDriver") ;   	    }catch(ClassNotFoundException e){   	    System.out.println("找不到驅(qū)動程序類 ,加載驅(qū)動失敗!");   	    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;	}	/**	 * 字符轉(zhuǎn)換	 * 	 * @param pstmt	 *           	 * @param params	 *           	 * @throws SQLException	 */	public void setValue(PreparedStatement pstmt, List<Object> params)			throws SQLException {		// 字符轉(zhuǎn)換		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));				}			}		}	}	/**	 * 更新數(shù)據(jù)	 * 	 * @param sql	 *           	 * @param params	 *           	 * @return	 */	public int update(String sql, List<Object> params) {		int result = 0;		try {			conn = this.getConnection();			pstmt = conn.prepareStatement(sql);//預(yù)處理			this.setValue(pstmt, params);			result = pstmt.executeUpdate(); // 執(zhí)行sql語句		} catch (SQLException e) {			e.printStackTrace();		}		return result;	}3.連接數(shù)據(jù)庫成功后,就是用Apache軟件基金會的開放源碼函式庫,也就是POI來讀取Excle表格的數(shù)據(jù):

代碼如下:

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結(jié)尾				wb = new HSSFWorkbook(fis);//得到工作簿			}else if(filePath.endsWith(".xlsx")){				 //2007版本的excel,用.xlsx結(jié)尾				wb = new XSSFWorkbook(fis);//得到工作簿			}else{			}			return wb;		}		return null;	}	/**	 * 第一種遍歷方式:純粹的for循環(huán)	 * @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: // 數(shù)字  	                        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("數(shù)據(jù)插入成功:" + 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);				//循環(huán)遍歷每個sheet表的沒行數(shù)據(jù)				for(int j = 1; j < sheet.getPhysicalNumberOfRows(); j ++){					row = sheet.getRow(j);					//用迭代遍歷,因?yàn)槲铱匆娝幸粋€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);		}			}	}

發(fā)現(xiàn)數(shù)據(jù)庫中插入了數(shù)據(jù):

控制臺輸出了如下數(shù)據(jù):

發(fā)現(xiàn)可行。

總結(jié):

個人發(fā)現(xiàn)這樣寫有很大的一個弊端就是插入數(shù)據(jù)的時候,每讀取一行數(shù)據(jù)就把它插入到數(shù)據(jù)庫。這樣要頻繁寫重復(fù)的sql語句去的跟新(插入)數(shù)據(jù)庫。麻煩(因?yàn)椴皇荕ySql數(shù)據(jù)庫)。可以寫一個事務(wù),一次性插入,要么成功,要么失敗后回滾。還有一點(diǎn)就是對于數(shù)據(jù)的處理可以寫一個People類,表格中的第一和第二兩列的屬性作為它的變量,有點(diǎn)像Springmvc從jsp頁面?zhèn)鲗ο筮^來一樣,用它來傳值。不知道行不行,QAQ??傊?,這一段程序缺點(diǎn)多多。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀宁县| 广宗县| 西青区| 合阳县| 英德市| 莲花县| 沧源| 斗六市| 安岳县| 淮阳县| 古交市| 潍坊市| 渝中区| 晋江市| 东莞市| 汉寿县| 山西省| 达孜县| 买车| 宾川县| 洪雅县| 嘉鱼县| 庆元县| 游戏| 洪湖市| 突泉县| 连平县| 财经| 贵德县| 南汇区| 闸北区| 株洲县| 曲麻莱县| 青龙| 辽宁省| 新丰县| 平凉市| 安仁县| 大竹县| 彭阳县| 库车县|