POI遍历Excle表

最近一个哥哥给我出了一个题目:用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{   
	    //加载Oracle的驱动类   
	    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。总之,这一段程序缺点多多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值