1. 程式人生 > >簡單的POI匯出JSP頁面表格資料到excel

簡單的POI匯出JSP頁面表格資料到excel

資料庫中的equipment表格資料:


讀取資料庫中表格資料的程式碼TestExcel.java

public class TestExcel extends BaseAction{

	/**
	 * @param args
	 * @throws Exception 
	 */
	public  String excel()  {
		try{
		Connection connection = con();
        String sql = "select * from equipment";
        PreparedStatement  ps = pre(sql, connection);
       ResultSet rs =  ps.executeQuery();
        String [] string = {"裝置編號","學院名稱","入庫時間","實驗室位置","實驗箱名稱","使用狀態"};
       ArrayList listname = new ArrayList();
        for(int i = 0;i< string.length;i++){
        	listname.add(string[i]);
        }
       // ArrayList  listname = (ArrayList) Arrays.asList(string);
 	   ArrayList listData = new ArrayList();
       while(rs.next()){
    	   ArrayList list = new ArrayList();
    	   list.add(rs.getString(1));
    	   list.add(rs.getString(2));
    	   list.add(rs.getTimestamp(3));
    	   list.add(rs.getString(4));
    	   list.add(rs.getString(5));
    	   list.add(rs.getString(6));
    	   listData.add(list);
       }
       OutputStream out = response.getOutputStream();
		//重置輸出流
		response.reset();
		//設定匯出Excel報表的匯出形式
		response.setContentType("application/vnd.ms-excel");
		//設定下載的excel檔名稱
		response.setHeader("Content-Disposition", "attachment;filename=zfc.xls");  
		 ExcelFileGenerator ex = new ExcelFileGenerator(listname,listData);
		ex.expordExcel(out);
		//設定輸出形式
		System.setOut(new PrintStream(out));
		//重新整理輸出流
		out.flush();
		//關閉輸出流
		if(out!=null){
			out.close();
		}
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return null;
	}
	public static Connection con() throws Exception{
		Connection connection = null;
		Class.forName("com.mysql.jdbc.Driver");
		connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ems", "root", "123456");
		return connection;
	}
	
	public static PreparedStatement pre(String sql,Connection connection) throws Exception{
		PreparedStatement ps = null;
		ps = connection.prepareStatement(sql);
		return ps;
	}

}

將list集合的中的資料匯入到excel表中的步驟如下:

 * 1、建立 HSSFWorkBook物件
* 2、獲取要匯出的表格的總記錄數
* 3、根據總記錄和每個excels的所容納的記錄數,進行分頁處理,得出分為幾個sheet的excels
* 4、得出sheet,進行每個sheet的迴圈處理
*      4.1、通過workbook物件進行建立createSheet,HSSFSheet物件
*      4.2、擁有了HSSFSheet物件,建立sheet.createRow行表頭,單獨的一行即資料說明
*      4.3、建立表頭行HSSFRow,開始匯入表頭行資料,開始對錶頭這一行進行資料迴圈填充
*              4.3.1、通過行頭物件HSSFRow建立HSSFCell列物件
*              4.3.2、有列物件,可以設定顯示的樣式,單元格寬度通過sheet物件設定
*              4.3.3、列物件設定完了,可以進行值的填充cell.setValue
*       4.4、接著開始迴圈每一行資料,對總記錄進行迴圈,如果超過最大容量,那麼最大值就是它,否則就是實際記錄數
*       4.5、開始進入迴圈,然後都要建立一個行物件HSSFRow,根據現在的頁數取出第幾條資料集合,進行迴圈
*               4.5.1、也是通過HSSFRow,建立HSSFCell列物件
*               4.5.2、通過cell物件設定相應的樣式或者編碼
*               4.5.3、編碼設定完,就可以進行每列資料的填充
* 5、返回workBook物件

程式碼ExcelFileGenerator.java:

public class ExcelFileGenerator {

	private final int SPLIT_COUNT = 1500; //Excel每個工作簿的行數

	private ArrayList fieldName = null; //excel標題資料集

	private ArrayList fieldData = null; //excel資料內容	

	private HSSFWorkbook workBook = null;

	/**
	 * 構造器
	 * @param fieldName 結果集的欄位名
	 * @param data
	 */
	public ExcelFileGenerator(ArrayList fieldName, ArrayList fieldData) {

		this.fieldName = fieldName;
		this.fieldData = fieldData;
	}

	/**
	 * 1、建立 HSSFWorkBook物件
	 * 2、獲取要匯出的表格的總記錄數
	 * 3、根據總記錄和每個excels的所容納的記錄數,進行分頁處理,得出分為幾個sheet的excels
	 * 4、得出sheet,進行每個sheet的迴圈處理
	 *      4.1、通過workbook物件進行建立createSheet,HSSFSheet物件
	 *      4.2、擁有了HSSFSheet物件,建立sheet.createRow行表頭,單獨的一行即資料說明
	 *      4.3、建立表頭行HSSFRow,開始匯入表頭行資料,開始對錶頭這一行進行資料迴圈填充
	 *              4.3.1、通過行頭物件HSSFRow建立HSSFCell列物件
	 *              4.3.2、有列物件,可以設定顯示的樣式,單元格寬度通過sheet物件設定
	 *              4.3.3、列物件設定完了,可以進行值的填充cell.setValue
	 *       4.4、接著開始迴圈每一行資料,對總記錄進行迴圈,如果超過最大容量,那麼最大值就是它,否則就是實際記錄數
	 *       4.5、開始進入迴圈,然後都要建立一個行物件HSSFRow,根據現在的頁數取出第幾條資料集合,進行迴圈
	 *               4.5.1、也是通過HSSFRow,建立HSSFCell列物件
	 *               4.5.2、通過cell物件設定相應的樣式或者編碼
	 *               4.5.3、編碼設定完,就可以進行每列資料的填充
	 * 5、返回workBook物件
	 * 建立HSSFWorkbook物件
	 * @return HSSFWorkbook
	 */
	public HSSFWorkbook createWorkbook() {
       
		workBook = new HSSFWorkbook();
		int rows = fieldData.size();
		int sheetNum = 0;

		if (rows % SPLIT_COUNT == 0) {
			sheetNum = rows / SPLIT_COUNT;
		} else {
			sheetNum = rows / SPLIT_COUNT + 1;
		}

		for (int i = 1; i <= sheetNum; i++) {
			HSSFSheet sheet = workBook.createSheet("Page " + i);
			HSSFRow headRow = sheet.createRow((short) 0); 
			for (int j = 0; j < fieldName.size(); j++) {
				HSSFCell cell = headRow.createCell((short) j);
				//新增樣式
				cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				cell.setEncoding(HSSFCell.ENCODING_UTF_16);
				//新增樣式
				//設定所有單元格的寬度
				sheet.setColumnWidth((short)j, (short)6000);
				//建立樣式(使用工作本的物件建立)
				HSSFCellStyle cellStyle = workBook.createCellStyle();
				//建立字型的物件
				HSSFFont font = workBook.createFont();
				//將字型加粗
				font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
				//設定字型的顏色
				short color = HSSFColor.RED.index;
				font.setColor(color);
				//將新設定的字型屬性放置到樣式中
				cellStyle.setFont(font);
				if(fieldName.get(j) != null){
					cell.setCellStyle(cellStyle);
					cell.setCellValue((String) fieldName.get(j));
				}else{
					cell.setCellStyle(cellStyle);
					cell.setCellValue("-");
				}
			}

			for (int k = 0; k < (rows < SPLIT_COUNT ? rows : SPLIT_COUNT); k++) {
				HSSFRow row = sheet.createRow((short) (k + 1));
				//將資料內容放入excel單元格
				ArrayList rowList = (ArrayList) fieldData.get((i - 1)* SPLIT_COUNT + k);
			//	ArrayList rowList = fieldData;
				for (int n = 0; n < rowList.size(); n++) {
					HSSFCell cell = row.createCell((short) n);
					cell.setEncoding(HSSFCell.ENCODING_UTF_16);
					if(rowList.get(n) != null){
						cell.setCellValue((String) rowList.get(n).toString());
					}else{
						cell.setCellValue("");
					}
				}
			}
		}
		return workBook;
	}

	public void expordExcel(OutputStream os) throws Exception {
		workBook = createWorkbook();
		workBook.write(os);
		os.close();
	}

}