• Thứ Hai, 18/01/2010 09:11 (GMT+7)

    Hàm Java chuyển dữ liệu nhận từ Acces sang Excel

    Câu hỏi :
    Xin hỏi cách viết hàm Java chuyển dữ liệu từ Access ra Excel và hàm nhận dữ liệu từ Excel vào Access.

    Trả lời :
    Trong lập trình bằng Java, bạn có thể truy xuất dễ dàng các table trong các cơ sở dữ liệu bằng cách dùng các đối tượng ODBC (nằm trong package java.sql). Một file Access chứa nhiều bảng dữ liệu, một file *.xls cũng có thể chứa nhiều worksheet, mỗi worksheet cũng chính là 1 bảng dữ liệu. Tóm lại đoạn code truy xuất database dựa trên các đối tượng ODBC rất tổng quát và có thể truy xuất các bảng dữ liệu, cho dù chúng được quản lý bởi hệ quản trị cơ sở dữ liệu nào. Sau đây là qui trình điển hình để viết 1 ứng dụng Java bằng môi trường NetBeans (môi trường lập trình Java mã nguồn mở của hãng SUN) có chức năng chuyển dữ liệu từ 1 worksheet Excel sang 1 bảng trong Access:
     1. Chạy NetBeans, tạo 1 project ứng dụng loại Java - Java Desktop Application.
     2. Thiết kế form ứng dụng chứa các đối tượng giao diện cần dùng như sau:
     Đặt tên cho 4 textbox lần lượt là txtSrcFile, txtSheet, txtDestFile, txtTable. Đặt tên cho button là btnCopy.
     3. Tạo hàm xử lý click chuột trên button btnCopy rồi viết code cho hàm này như sau:
     //thêm lệnh import sau vào đầu file
     import java.sql.*;
     
     //hàm xử lý click chuột trên button Copy
     private void btnCopyActionPerformed(java.awt.event.ActionEvent evt) {
     //định nghĩa các biến cần dùng
     String srcFile = txtSrcFile.getText();
     String srcSheet = txtSheet.getText();
     String dstFile = txtDestFile.getText();
     String dstTable = txtTable.getText();
     Connection srcCon = null, dstCon =null;
     Statement srcStmt = null, dstStmt = null;
     ResultSet srcRs = null, dstRs = null;
     String strSQL = null;
     int i, nocs=0;
     //xây dựng chuỗi ConnectionString truy xuất file Excel
     String conStr = "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)} ;DBQ=" + srcFile + ";READONLY=true}";
     try {
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     //tạo connection đến file Excel
     srcCon = DriverManager.getConnection(conStr, "", "");
     srcStmt = srcCon.createStatement();
     //tạo ResultSet chứa các hàng của Sheet cần chuyển
     srcRs = srcStmt.executeQuery("Select * from [" + srcSheet + "$]");
     //xây dựng lệnh SQL tạo Table đích
     strSQL = "CREATE TABLE " + dstTable + "(";
     //duyệt tìm từng field của table nguồn
     int fStart = 1;
     ResultSetMetaData rsmd = srcRs.getMetaData();
     nocs = rsmd.getColumnCount();
     for (i=1; i <=nocs; i++) {
     if (fStart != 0) {
     strSQL = strSQL + rsmd.getColumnName(i) + " " + rsmd.getColumnTypeName(i);
     fStart = 0;
     } else strSQL = strSQL + ", " + rsmd.getColumnName(i) + " " + rsmd.getColumnTypeName(i);
     }
     strSQL = strSQL + ")";
     //Tạo connection tới database đích
     conStr = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + dstFile + ";READONLY=false}";
     dstCon = DriverManager.getConnection(conStr, "", "");
     dstStmt = dstCon.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
     ResultSet.CONCUR_UPDATABLE);
     } catch (Exception e) {}
     //xóa table nếu đã có rồi
     try {
     dstRs = dstStmt.executeQuery("drop table " + dstTable);
     } catch (Exception e) {}
     try {
     //Tạo table trên database đích
     dstStmt.executeQuery(strSQL);
     } catch (Exception e) {}
     try {
     //Tạo resultset chứa các data của table đích (hiện là rỗng)
     dstRs = dstStmt.executeQuery("select * from " + dstTable);
     //duyệt copy từng record từ nguồn sang đích
     Object obj;
     while (srcRs.next()) {
     //di chuyển tới record cần thêm
     dstRs.moveToInsertRow();
     //duyệt thêm từng field
     for (i = 1; i <= nocs; i++) {
     obj = srcRs.getObject(i);
     dstRs.updateObject(i,obj);
     }
     //tạo thêm record trống mới
     dstRs.insertRow();
     }
     //đóng các đối tượng đang dùng lại
     srcRs.close(); dstRs.close();
     srcCon.close();
     dstCon.close();
     } catch (Exception ex) {
     System.out.println(ex.toString());
     }
     }
     4. Chọn menu Run.Run Project để chạy ứng dụng vừa viết, nhập thử tên file Excel, tên Sheet cần chuyển, nhập tên file Access và tên table cần chứa kết quả rồi nhấn button "Bat dau chuyen". Sau đó kiểm tra xem trong file Access có table mới tạo ra không, nội dung của table có giống với sheet Excel gốc không.

     Lưu ý rằng với code của ứng dụng trên, file Access chứa kết quả phải có sẵn (nhưng chưa có bản dữ liệu trong worksheet Excel).
     
    Chuyên mục: Lập trình