1. 程式人生 > >一個簡單的從資料庫道出資料到excel的模板程式碼

一個簡單的從資料庫道出資料到excel的模板程式碼

在實際工作中 有時候我們經常需要將各種資料從資料庫中查出來後,封裝成excel檔案供使用者下載使用,特別是很多後臺管理系統.但是其實這些程式碼其實基本都是固定的,那麼我們不妨把它整理出來,當下次需要用到的時候直接Copy,大大提高我們的開發效率

使用下面模板時如果你是maven專案,需要匯入apache POI依賴

   <!-- 版本屬性配置 -->
  <properties>
		 
		<poi.version>3.11</poi.version>
	 
	</properties>
<!-- Excel解析工具類 -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>${poi.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>${poi.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>${poi.version}</version>
		</dependency>

其他Java專案需要匯入poi jar包

@Override
	public void exportXls() throws IOException {
		// 先查詢分割槽資料
		List<SubArea> listSubarea = subAreaDao.findAll();
		if (listSubarea != null && listSubarea.size() > 0) {
			// 通過poi匯出到頁面 xls 2003
			HSSFWorkbook hs = new HSSFWorkbook();// 建立一個檔案物件
			HSSFSheet createSheet = hs.createSheet();// sheet頁物件

			// 建立excel資料標題
			HSSFRow titleRow = createSheet.createRow(0);// 建立行下標從0開始
			titleRow.createCell(0).setCellValue("編號");
			titleRow.createCell(1).setCellValue("關鍵字");
			titleRow.createCell(2).setCellValue("輔助關鍵字");
			titleRow.createCell(3).setCellValue("省市區");
			titleRow.createCell(4).setCellValue("定區名稱");
			// 建立excel資料行
			for (SubArea subArea : listSubarea) {
				//建立資料行的編號是動態獲取的  
				int lastRowNum = createSheet.getLastRowNum();
				//建立資料行 從第2行開始  
				HSSFRow dataRow = createSheet.createRow(lastRowNum+1);
				dataRow.createCell(0).setCellValue(subArea.getId());
				dataRow.createCell(1).setCellValue(subArea.getKeyWords());
				dataRow.createCell(2).setCellValue(subArea.getAssistKeyWords());
				dataRow.createCell(3).setCellValue(subArea.getArea().getName());
				dataRow.createCell(4).setCellValue(subArea.getFixedArea().getFixedAreaName());
			}
			//獲取一個輸出流 給HSSFWorkbook中write   一個流 兩個頭
			ServletOutputStream outputStream = ServletActionContext.getResponse().getOutputStream();
			String fileName = "分割槽資料.xls";
			
			//獲取當前瀏覽器
			String agent = ServletActionContext.getRequest().getHeader("User-Agent");
			//將檔名稱轉成瀏覽器認識編碼方式
			String newFileName = FileUtils.encodeDownloadFilename(fileName, agent);
			//1.檔名稱  setHeader:讓瀏覽器識別當前下載是excel檔案
			ServletActionContext.getResponse().setHeader("content-disposition", "filename="+newFileName);
			//2.檔案字尾
			ServletActionContext.getResponse().setContentType("application/vnd.ms-excel;charset=UTF-8");
			hs.write(outputStream);
		}

	}

其中用到的將檔名稱轉成瀏覽器認識編碼方式(解決中文檔名亂碼問題)的根據類

public class FileUtils {
		/**
		 * 下載檔案時,針對不同瀏覽器,進行附件名的編碼
		 * 
		 * @param filename
		 *            下載檔名
		 * @param agent
		 *            客戶端瀏覽器
		 * @return 編碼後的下載附件名
		 * @throws IOException
		 */
		public static String encodeDownloadFilename(String filename, String agent)
				throws IOException {
			if (agent.contains("Firefox")) { // 火狐瀏覽器
				filename = "=?UTF-8?B?"
						+ new BASE64Encoder().encode(filename.getBytes("utf-8"))
						+ "?=";
				filename = filename.replaceAll("\r\n", "");
			} else { // IE及其他瀏覽器
				filename = URLEncoder.encode(filename, "utf-8");
				filename = filename.replace("+"," ");
			}
			return filename;
		}
}