一個簡單的從資料庫道出資料到excel的模板程式碼
阿新 • • 發佈:2019-01-29
在實際工作中 有時候我們經常需要將各種資料從資料庫中查出來後,封裝成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; } }