jsp(servlet)使用poi導出excel數據文件

網站通過Excel導出數據已經成爲各種網站的一個基本功能,下面就詳細介紹下如何使用poi.jar方式來導出excel文件。具體步驟如下:

1、創建一個網站,下面我創建一個叫test的網站,然後將poi的jar包放入lib文件夾。我這裏是下載鏈接poi-2.5.1.jar.

結構目錄如下:


2、然後我們可以創建一個用來訪問的jsp界面(主要是提交到servlet,可有可無)

代碼如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  
  <body>
    <form action="excel">
    <input value="提交" type="submit">
    </form>
  </body>
</html>
3、事先創建好的操作文檔(可下載)ExcelFileGenerator
/**
 * 系統數據導出Excel 生成器
 * @version 1.0
 */
package com.whp.test;

import java.io.OutputStream;
import java.util.ArrayList;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

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;
	}

	/**
	 * 創建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);
				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();
	}

}


4、創建一個名稱爲excel的servlet.  ------通過getFieldName()和getFieldData()來模擬表格數據

package com.whp.test;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class excel extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
		//初始化fieldName,fieldDate
		ArrayList fieldName=getFieldName();    //excel標題數據集
		ArrayList fieldData=getFieldData();    //excel數據內容
        String myexcel="myexcel";
		//回去輸出流
		OutputStream out=response.getOutputStream();
		//重置輸出流
		response.reset();
		//設置導出Excel報表的導出形式
		response.setContentType("application/vnd.ms-excel");
		response.setHeader("Content-Disposition","attachment;filename="+myexcel+".xls");
		ExcelFileGenerator  efg=new ExcelFileGenerator(fieldName, fieldData);
		
			efg.expordExcel(out);
		//設置輸出形式
		System.setOut(new PrintStream(out));
		//刷新輸出流
		out.flush();
		//關閉輸出流
		if(out!=null){
			out.close();
		}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	     this.doGet(request, response);
	}

	//模擬提供excel中的標題數據集
	public ArrayList getFieldName(){
		String str[]={"姓名","學號","性別"};
		ArrayList list=new ArrayList();
		for(int i=0;i<str.length;i++){
			list.add(str[i]);
		}
		return list;
	}
	//模擬提供excel中的標題數據內容
	public ArrayList getFieldData(){
		
		ArrayList list1=new ArrayList();
		String str[][]={{"wang","01","男"},{"hai","02","男"},{"ping","03","女"}};
	    
		for(int i=0;i<str.length;i++)
		{
			ArrayList list=new ArrayList();
			for(int j=0;j<str[0].length;j++)
			{
				list.add(str[i][j]);
			}
			list1.add(list);
		}
		return list1;
	}

}

5、測試:

通過localhost:8080/test/excel.jsp訪問,然後點擊按鈕即可得到下載文件。

測試數據結果如下:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章