Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

Export dữ liệu ra Excel dùng POI

Một vấn đề mà tôi nhận được nhiều request nữa đó là làm sao để kết xuất dữ liệu ra Excel nhằm các mục đích báo cáo, tương tác cơ bản người dùng,…

Nhận thấy đó cũng là điều rất cần thiết nên tôi viết bài này nhằm hỗ trợ các bạn gặp khúc mắc vê vấn đề này.

Có rất nhiều kỹ thuật để làm được việc này. Tuy nhiên ở đây tôi chọn POI – một dự án open-source của Apache để sử dụng. Bạn cần phải download thư viện này tại poi.apache.org. Sau khi download về, giải nén và bạn có thư viện sẵn sàng cho việc export. Phiên bản tôi sử dụng ở đây là bản poi-3.8-beta4-20110826. Bạn có thể download các bản khác xài cũng được. Kích thước gói jar vào khoảng 1.8MB ( chỉ cần 1 file jar poi-3.8-beta4-20110826.jar là đủ nhé bạn).

Bạn có thể dùng Eclipse hay IDE nào đó cũng được miễn là bạn reference đến thư viện này. Ở đây tôi dùng Eclipse.

Trong ví dụ này tôi kết nối đến cơ sở dữ liệu Access(bạn có thể khác) để lấy dữ liệu sau đó kết xuất ra excel. Cơ sở dữ liệu này có cấu trúc như sau:

http://vovanhai.files.wordpress.com/2011/12/db.png

Cấu trúc chương trình như sau:
http://vovanhai.files.wordpress.com/2011/12/programstructure1.png
Trong đó lớp ConnectDB dùng để kết nối đến cơ sở dữ liệu (ở đây là ms access), lớp Export2Office chứa các phương thức liên quan đến kết xuất cơ sở dữ liệu ra excel. Cuối cùng là lớp Export2Office_Driver cho mục đích thử các phương thức vừa tạo.

Code của chương trình như sau:
Lớp ConnectDB.java

package vovanhai.wordpress.com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class ConnectDB {
	//connection kết nối cơ sở dữ liệu
	private Connection con;

	public ConnectDB(String accessDBName) throws Exception{
		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		String url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+accessDBName;
		con=DriverManager.getConnection(url);
	}
	/**
	 * Lấy 1 bảng cơ sở dữ liệu
	 * @param tableName là bảng cơ sở dữ liệu cần lấy
	 * @return
	 * @throws Exception
	 */
	public ResultSet getTable(String tableName)throws Exception{
		String sql="select * from "+tableName;
		PreparedStatement pstmt=con.prepareStatement(sql);
		return pstmt.executeQuery();
	}

	/**
	 * Lấy 1 resultset từ  câu truy vấn
	 * @param sql là câu truy vấn
	 * @return
	 * @throws Exception
	 */
	public ResultSet getTableFromSQL(String sql)throws Exception{
		PreparedStatement pstmt=con.prepareStatement(sql);
		return pstmt.executeQuery();
	}
	/**
	 * Lấy 1 connection
	 * @return
	 */
	public Connection getConnection(){
		return con;
	}
	/**
	 * Đóng kết nối
	 * @throws Exception
	 */
	public void CloseConnection()throws Exception{
		if(con!=null)
			con.close();
	}
}

Lớp Export2Office .java

package vovanhai.wordpress.com;

import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
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;

public class Export2Office {
	//workbook ta làm việc ~ excel file
	private Workbook wb;
	public Export2Office(Workbook wb) {
		this.wb=wb;
	}
	/**
	 * Export 1 result set ra file excel
	 * @param rs là result set cần xuất
	 * @param sheetName là tên của sheet trong workbook
	 * @throws Exception
	 */
	public void Export(ResultSet rs, String sheetName)throws Exception{
		int nos=wb.getNumberOfSheets();
		for (int i = 0; i < nos; i++) {
			String sn=wb.getSheetName(i);
			if(sn.equalsIgnoreCase(sheetName)){
				sheetName+="$1";
			}
		}
		//tạo worksheet
		Sheet sheet = wb.createSheet(sheetName);
		//Lấy metadata làm column header
		ResultSetMetaData rsmd=rs.getMetaData();
		//tạo dòng tiêu đề
		Row row = sheet.createRow((short)0);
		int colNum=rsmd.getColumnCount();//số fields có trong bảng
		//duyệt qua các fields lấy làm column header
		for (int i = 0; i < colNum; i++) {
			String col=rsmd.getColumnName(i+1);
			Cell cell=row.createCell(i);
			cell.setCellValue(col);
		}
		//điền giá trị vào các hàng
		while(rs.next()){
			//tạo 1 hàng mới
			row=sheet.createRow(rs.getRow());
			for (int i = 0; i < colNum; i++) {
				String val=rs.getString(i+1);
				//tạo 1 ô mới
				Cell cell=row.createCell(i);
				cell.setCellValue(val);
			}
		}

	}
	/**
	 * Lấy tất cả các bảng của cơ sở dữ liệu sau đó export ra thành các sheet trong 1 file excel
	 * @param AccessDBFilePath là đường dẫn tuyệt đối đến file access
	 * @param excelFilePath là đường dẫn đến file excel kết xuất
	 * @throws Exception
	 */
	public void ExportAllDBFiles(String AccessDBFilePath,String excelFilePath)throws Exception{
		ConnectDB condb=new ConnectDB(AccessDBFilePath);
		Connection con=condb.getConnection();

		DatabaseMetaData dbm=con.getMetaData();
		String []types={"TABLE"};
		ResultSet rsm= dbm.getTables(null, null, null, types);
		while(rsm.next()){
			String tableName=rsm.getString("TABLE_NAME");
			ResultSet rs=condb.getTable(tableName);
			Export(rs,tableName);
		}
		//Ghi dữ liệu xuống file
		FileOutputStream fos=new FileOutputStream(excelFilePath,true);
		wb.write(fos);
		fos.close();
		condb.CloseConnection();
	}
	/**
	 * Export 1 table
	 * @param AccessDBFilePath la file access cần export
	 * @param tableName là bảng cần export
	 * @param excelFilePath đường dẫn đến file excel cần tạo
	 * @throws Exception
	 */
	public void ExportTable(String AccessDBFilePath,String tableName,String excelFilePath)throws Exception{
		ConnectDB condb=new ConnectDB(AccessDBFilePath);
		ResultSet rs=condb.getTable(tableName);
		Export(rs,tableName);
		//Ghi dữ liệu xuống file
		String fileName=excelFilePath;
		FileOutputStream fos=new FileOutputStream(fileName,true);
		wb.write(fos);
		fos.close();
		condb.CloseConnection();
	}
}

Lớp Export2Office_Driver.java

package vovanhai.wordpress.com;

import java.io.FileOutputStream;
import java.sql.ResultSet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;

public class Export2Office_Driver {

	public static void main(String[] args) throws Exception{

		System.out.println("waiting for export...");
		long before=System.currentTimeMillis();

		//demo 01-export toàn bộ cơ sở dữ liệu thành 1 file excel với mỗi bảng là 1 sheet
		Workbook wb=new HSSFWorkbook();
		Export2Office ep=new Export2Office(wb);
		ep.ExportAllDBFiles("school_DB.mdb", "ex1.xls");

		//demo 02- export 1 bảng ra file excel
		Workbook wb2=new HSSFWorkbook();
		Export2Office ep2=new Export2Office(wb2);
		ep2.ExportTable("school_DB.mdb","tblClass", "ex2.xls");

		//demo 03-export kết quả của 1 câu seleect sql bất kỳ ra excel
		Workbook wb3=new HSSFWorkbook();
		ConnectDB condb=new ConnectDB("school_DB.mdb");
		Export2Office ep3=new Export2Office(wb3);
		String sql="select * from tblClass c inner join tblStudents s on s.classID=c.classID "+
		"where s.classID='cdth4a'";
		ResultSet rs=condb.getTableFromSQL(sql);
		ep3.Export(rs, "Join");
		FileOutputStream fos=new FileOutputStream("ex3.xls",true);
		wb3.write(fos);
		fos.close();
		condb.CloseConnection();

		//finish
		long after=System.currentTimeMillis();
		System.out.println("finished after "+(after-before)+" milliseconds");
	}
}

Chạy thử ứng dụng, sau đó chọn project, nhấn F5 để refresh lại project, ta có kết quả

http://vovanhai.files.wordpress.com/2011/12/programstructurelast.png

Mở thử các file excel để thưởng thức nhỉ!

File access demo bạn có thể download tại đây.

 

3 Responses to “Export dữ liệu ra Excel dùng POI”

  1. em cám ơn thầy

  2. phuong.nm said

    Em chào Thầy.
    Hiện tại em đang sử dụng BI Plaform pentaho để tạo report
    Bây giờ em muốn gọi việc xuất các File : Excel,PDF,XML…. trực tiếp từ java thì phải làm thế nào vậy thầy

    Vd : trên Web em có 1 nút xuất PDF. Khi nhấn nút thì nó download về cho mình fle PDF với data được get từ DB.

    Thì phải làm như thế nào, thầy có thể hướng dẫn giúp em được không ạ
    Thân.

  3. hoang said

    thay co the gui cho e xin file access demo dc khong ah e dang rat can

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.

Join 2,209 other followers

%d bloggers like this: