1. 程式人生 > >JAVA Excel資料批量匯入到SQL資料庫

JAVA Excel資料批量匯入到SQL資料庫

    今天剛好需要批量將Excel裡的資料匯入到SQL Server,本來打算用Genero寫的,發現官方驅動包找不到SQL Server 2012的驅動,我的天啊,無解!只好用JAVA來寫!JAVA通過載入JDBC驅動輕鬆搞定!除了引用sqljdbc4.jar 庫外,還需要引用另外一個庫 jxl.jar。這兩個庫很容易找到下載。

下面直接看原始碼部分吧,功能很簡單,但是需要注意一點:jxl不能處理.xlsx結尾的Excel檔,編譯會提示發現不了OLE物件的錯誤。解決的辦法是開啟.xlsx文件,另存為Excel97-2003 字尾.xls  。這個問題一開始耽誤了我不少時間。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;


public class Test {

	public static void main(String[] args) throws SQLException {
		Object[] obj = null;
		ArrayList<Object[]> list = new ArrayList<Object[]>();  //定義ArrayList,包含陣列型別
		String filePath = "C:/Users/xxx68099/Desktop/User.list.xls";  //定義Excel檔案路徑
		InputStream is = null;
		Workbook rwb = null;
		try {
			is = new FileInputStream(filePath); //定義文字輸入流
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		try {
			rwb = Workbook.getWorkbook(is); //開啟Workbook
		} catch (BiffException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		Sheet sht = rwb.getSheet("Sheet1"); //開啟Workbook中Sheet1
		int col = sht.getColumns();  //獲得Excel列
		int row = sht.getRows();  //獲得Excel行
		Cell c1 = null;
		
		for(int i=0; i<row; i++)  //先將資料按行裝入一個一維陣列中, 然後將陣列逐個加入到ArrayList
		{
			obj = new Object[col];
			for(int j=0; j<col; j++)
			{
				c1 = sht.getCell(j, i);
				obj[j] = c1.getContents();
			}
			list.add(obj);
		}

		
//這裡再從ArrayList裡讀出來是沒有必要的,可以直接在getCell資料時,加入SQL批處理,減少迴圈,不過為了說明清晰,我還是這樣寫
		String  url;
		String passname;
		String password;
		String driver;
		Connection con = null;
		PreparedStatement ps = null;
		passname = "sa";  //SQL Server登陸賬號
		password = "
[email protected]
"; //SQL Server登陸密碼 driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //驅動載入 try { Class.forName(driver); } catch (ClassNotFoundException e) { JOptionPane.showMessageDialog(null, "資料庫載入失敗!"); e.printStackTrace(); } url = "jdbc:sqlserver://172.xx.xxx.xx"+";"+"DatabaseName=RRS";//URL連結 String sql = "INSERT INTO UserLocation (MAIL, NT_ACCOUNT,LOCATION, OFFICE, Checked) VALUES (?, ?, ?, ?, ?)"; //String sql = "DELETE FROM UserLocation WHERE MAIL = ? AND NT_ACCOUNT = ? AND LOCATION = ? AND OFFICE = ? AND Checked = ?"; con = DriverManager.getConnection(url, passname, password); //獲得連結 con.setAutoCommit(true); //設定自動提交 ps = con.prepareStatement(sql);// SQL預處理 obj = new Object[5]; for(int k=0; k<row; k++) //將ArrayList資料讀出來,作為引數,批量INSERT到資料庫 { obj = list.get(k); ps.setString(1, obj[0].toString()); ps.setString(2, obj[1].toString()); ps.setString(3, obj[2].toString()); ps.setString(4, obj[3].toString()); ps.setString(5, obj[4].toString()); ps.addBatch(); } ps.executeBatch(); //批量執行 ps.close(); con.close(); } }