天天看點

【SSH項目實戰】國稅協同平台-6.POI導出使用者清單

我們使用POI技術來導出和導入我們之前的使用者清單。POI在之前的《傑信商貿》工程中已經詳細介紹過了,這裡就不贅述。我們直接上手開發。

首先說下一我們的POI列印的流程,我們接下來就按照這個流程開發:

1、建立工作簿

1.1、建立合并單元格對象

1.2、頭标題樣式

1.3、列标題樣式

2、建立工作表

2.1、加載合并單元格對象

3、建立行

3.1、建立頭标題行;并且設定頭标題

3.2、建立列标題行;并且設定列标題

4、操作單元格;将使用者清單寫入excel

5、輸出

可以回顧一下我們之前的使用者清單:

【SSH項目實戰】國稅協同平台-6.POI導出使用者清單

可以看到這裡有“導入”和“導出”的按鈕,可以對清單的資料進行excel文本的導入和導出工作。

我們列印的最終效果:

【SSH項目實戰】國稅協同平台-6.POI導出使用者清單

首先我們要先導入POI的jar包:

poi-3.11-20141221.jar

poi-ooxml-3.11-20141221.jar

poi-ooxml-schemas-3.11-20141221.jar

我們在清單的界面的“導出”按鈕部分添加點選事件的js代碼,是我們能夠點選跳轉發到相應的action去執行列印excel表的操作:

//導出清單
function doExportExcel(){
	window.open("${basePath}tax/user_exportExcel.action");
}
           

我們在UserAction類中添加exportExcel方法來列印資料:

//導出清單
public void exportExcel(){
	try {
		//1.查找使用者清單
		userList=userService.findObjects();
		//2.導出
		HttpServletResponse response=ServletActionContext.getResponse();
		//告訴浏覽器要彈出的文檔類型
		response.setContentType("application/x-execl");
		//告訴浏覽器這個文檔要作為附件給别人下載下傳(防止浏覽器不相容,檔案名要編碼)
		response.setHeader("Content-Disposition", "attachment;filename="+new String("使用者清單.xls".getBytes(),"ISO-8859-1"));
		//擷取輸出流
		ServletOutputStream outputStream= response.getOutputStream();
		userService.exportExcel(userList,outputStream);
		if(outputStream !=null){
			outputStream.close();
		}
	
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
           

userService.exportExcel(userList,outputStream);這個方法我們還沒有實作,是以我們在userService接口中定義這個方法:

/

/導出清單
public void exportExcel(List<User> userList,ServletOutputStream outputStream);
           

然後在userServiceImpl類中去實作這個方法:

@Override
public void exportExcel(List<User> userList,
		ServletOutputStream outputStream) {
	
	try {
		//1.建立工作簿
		HSSFWorkbook workbook=new HSSFWorkbook();
		//1.1建立合并單元格對象
		CellRangeAddress cellRangeAddress=new CellRangeAddress(0,0,0,4);//起始行号,結束行号,起始列号,結束列号
	
		//1.2、頭标題樣式
		HSSFCellStyle style1=creatCellStyle(workbook,(short)16);
		
		//1.3、列标題樣式
		HSSFCellStyle style2=creatCellStyle(workbook,(short)13);
	
		//2、建立工作表
		HSSFSheet sheet=workbook.createSheet("使用者清單");
		//2.1、加載合并單元格對象
		sheet.addMergedRegion(cellRangeAddress);
		//設定預設列寬
		sheet.setDefaultColumnWidth(20);
		
		//3.建立行
		//3.1、建立頭标題行;并設定頭标題
		HSSFRow row1=sheet.createRow(0);
		HSSFCell cell1=row1.createCell(0);
		//加載單元格樣式
		cell1.setCellStyle(style1);
		cell1.setCellValue("使用者清單");
		
		//3.2、建立列标題行,并設定列标題
		HSSFRow row2=sheet.createRow(1);
		String []titles={"使用者名","賬号","所屬部門","性别","電子郵箱"};
		for (int i = 0; i < titles.length; i++) {
			HSSFCell cell2=row2.createCell(i);
			//加載單元格樣式
			cell2.setCellStyle(style2);
			cell2.setCellValue(titles[i]);
		}
		
		//4、操作單元格,将使用者寫入Execl
		if(userList!=null){
			for (int j = 0; j < userList.size(); j++) {
				HSSFRow row=sheet.createRow(j+2);
				HSSFCell cell11=row.createCell(0);
				cell11.setCellValue(userList.get(j).getName());
				HSSFCell cell12=row.createCell(1);
				cell12.setCellValue(userList.get(j).getAccount());
				HSSFCell cell13=row.createCell(2);
				cell13.setCellValue(userList.get(j).getDept());
				HSSFCell cell14=row.createCell(3);
				cell14.setCellValue(userList.get(j).isGender()?"男":"女");
				HSSFCell cell15=row.createCell(4);
				cell15.setCellValue(userList.get(j).getEmail());
			}
		}
		//5、輸出
		workbook.write(outputStream);
		workbook.close();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
}


/**
 * 建立單元格樣式
 * @param workbook 工作簿
 * @param fontSize 字型大小
 * @return 單元格樣式
 * */
private HSSFCellStyle creatCellStyle(HSSFWorkbook workbook,short fontSize) {
	HSSFCellStyle style=workbook.createCellStyle();
	style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水準居中
	style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
	//建立字型
	HSSFFont font=workbook.createFont();
	font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字型
	font.setFontHeightInPoints(fontSize);
	//加載字型
	style.setFont(font);
	
	return style;
}
           

下面進行測試:

點選導出

【SSH項目實戰】國稅協同平台-6.POI導出使用者清單

然後導出對話框,點選下載下傳:

【SSH項目實戰】國稅協同平台-6.POI導出使用者清單

得到檔案,打開之後發現就是我們所要的結果:

【SSH項目實戰】國稅協同平台-6.POI導出使用者清單

至此,我們的使用者清單導入列印成功!

這裡要注意的是,我們因為列印這一項功能就占據了Service的大部分空間,使得Service方法過于臃腫,是以我們要将列印方法抽取出來,放在一個專門提供列印服務的類中,是以我們專門編寫一個工具類:

package cn.edu.hpu.tax.core.util;

import java.util.List;

import javax.servlet.ServletOutputStream;


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.CellRangeAddress;


import cn.edu.hpu.tax.user.entity.User;


public class ExcelUtil {
	/**
	 * 導出使用者的所有清單到Execl
	 * @param userList 使用者清單
	 * @param outputStream 輸出流
	 * */
	public static void exportExcel(List<User> userList,
			ServletOutputStream outputStream) {
		
		try {
			//1.建立工作簿
			HSSFWorkbook workbook=new HSSFWorkbook();
			//1.1建立合并單元格對象
			CellRangeAddress cellRangeAddress=new CellRangeAddress(0,0,0,4);//起始行号,結束行号,起始列号,結束列号
		
			//1.2、頭标題樣式
			HSSFCellStyle style1=creatCellStyle(workbook,(short)16);
			
			//1.3、列标題樣式
			HSSFCellStyle style2=creatCellStyle(workbook,(short)13);
		
			//2、建立工作表
			HSSFSheet sheet=workbook.createSheet("使用者清單");
			//2.1、加載合并單元格對象
			sheet.addMergedRegion(cellRangeAddress);
			//設定預設列寬
			sheet.setDefaultColumnWidth(20);
			
			//3.建立行
			//3.1、建立頭标題行;并設定頭标題
			HSSFRow row1=sheet.createRow(0);
			HSSFCell cell1=row1.createCell(0);
			//加載單元格樣式
			cell1.setCellStyle(style1);
			cell1.setCellValue("使用者清單");
			
			//3.2、建立列标題行,并設定列标題
			HSSFRow row2=sheet.createRow(1);
			String []titles={"使用者名","賬号","所屬部門","性别","電子郵箱"};
			for (int i = 0; i < titles.length; i++) {
				HSSFCell cell2=row2.createCell(i);
				//加載單元格樣式
				cell2.setCellStyle(style2);
				cell2.setCellValue(titles[i]);
			}
			
			//4、操作單元格,将使用者寫入Execl
			if(userList!=null){
				for (int j = 0; j < userList.size(); j++) {
					HSSFRow row=sheet.createRow(j+2);
					HSSFCell cell11=row.createCell(0);
					cell11.setCellValue(userList.get(j).getName());
					HSSFCell cell12=row.createCell(1);
					cell12.setCellValue(userList.get(j).getAccount());
					HSSFCell cell13=row.createCell(2);
					cell13.setCellValue(userList.get(j).getDept());
					HSSFCell cell14=row.createCell(3);
					cell14.setCellValue(userList.get(j).isGender()?"男":"女");
					HSSFCell cell15=row.createCell(4);
					cell15.setCellValue(userList.get(j).getEmail());
				}
			}
			//5、輸出
			workbook.write(outputStream);
			workbook.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 建立單元格樣式
	 * @param workbook 工作簿
	 * @param fontSize 字型大小
	 * @return 單元格樣式
	 * */
	private static HSSFCellStyle creatCellStyle(HSSFWorkbook workbook,short fontSize) {
		HSSFCellStyle style=workbook.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水準居中
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
		//建立字型
		HSSFFont font=workbook.createFont();
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字型
		font.setFontHeightInPoints(fontSize);
		//加載字型
		style.setFont(font);
		
		return style;
	}
}
           

然後修改Service:

@Override
public void exportExcel(List<User> userList,
		ServletOutputStream outputStream) {
	ExcelUtil.exportExcel(userList, outputStream);
}
           

再次測試沒有問題,我們方法抽出成功。

使用者清單導出完成,下一次我們來探讨導入功能。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/49382979