最近一个哥哥给我出了一个题目:用POI把Excle表的数据插入到数据库中。
下面是我做的:
明确两点。1.读取Excel表的数据
2.连接数据库(oracle)并插入数据
1。首先Maven导包:,然后用 mvn install:install-file -Dfile= -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar 命令将包导入本地Maven仓库。
2。第二步连接数据库: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。总之,这一段程序缺点多多。