JAVA Excel資料批量匯入到SQL資料庫
阿新 • • 發佈:2019-01-02
今天剛好需要批量將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(); } }