Java 從資料庫中匯出 Excle 表
阿新 • • 發佈:2018-11-09
目錄
一、效果圖
二、excle 生成的工具類原理
通過呼叫工具類,先判斷在伺服器中指定的資料夾中有沒有存在同名的 excle 表,有的話就先刪除掉,沒有的話,就在指定的資料夾中生成一份新的 excle 表格,再呼叫瀏覽器的下載介面,把 excle 表下載到自己電腦上的指定位置,然後刪除掉伺服器上的 excle 表格。
三、excle 生成的工具類原始碼
CreateExcelFile : 生成 excle 的函式
send : 呼叫瀏覽器下載介面的函式
main : 測試類,可以自己執行下測試工具類是否能夠正常使用。
原始碼中部分可能需要修改的地方,都帶有解釋,其它自己看。
需要匯入的兩個 jar 包:
package com.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Border; import jxl.format.BorderLineStyle; import jxl.format.Colour; import jxl.format.UnderlineStyle; import jxl.format.VerticalAlignment; import jxl.write.Label; import jxl.write.NumberFormats; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; public class MakeExcel { public MakeExcel() {} // 入參是一個list,一條資料存一個map物件,map物件中存列和值得對應關係,destFile當然就是要存的檔案資訊。 // headList很重要,它是列的展示,當然和資料的列要對應不然找不到對應的地方儲存。 public static void CreateExcelFile(List<Map<String, Object>> list, File destFile, List<String> headList, String message) throws WriteException, IOException { int sizeAll = list.size(); // 設定每頁最大條數 65534 ,求出整數頁 wholeNumber int wholeNumber = sizeAll / 65534; // 求出最後一頁的條數 int yu = sizeAll % 65534; int sheetSize = 1; int flagList = 1; if (sizeAll <= 65534) { sheetSize = 1; } else { if (yu > 0) { sheetSize = wholeNumber + 1; } else { sheetSize = wholeNumber; } } WritableWorkbook book = null; book = Workbook.createWorkbook(destFile); if (list.size() == 0) { book.write(); } else { for (int j = 0; j < sheetSize; j++) { int index; System.out.println("*************************sheet(excle的左下角)" + j + "***************************"); WritableSheet sheet = book.createSheet(destFile.getName().replace(".xls", "") + j, j); /** * ARIAL : 字型樣式 【WritableFont.createFont("宋體") : 宋體字型的設定】 * 19 : 字型大小 * WritableFont.BOLD, false 是判斷是否為斜體,選擇true時為斜體 ,預設為 false */ WritableFont BoldFont = new WritableFont(WritableFont.TIMES, 15); WritableCellFormat wcf_center = new WritableCellFormat(BoldFont); wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 線條 wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直對齊 wcf_center.setAlignment(Alignment.CENTRE); // 文字水平對齊 wcf_center.setWrap(false); // 文字是否換行 // wcf_center.setBackground(Colour.LIGHT_GREEN);// 單元格背景顏色 for (int i = 0; i < headList.size() + 1; i++) { sheet.setColumnView(i, 30);// 設定第i列的寬度 } // 合併首行 sheet.mergeCells(0, 0, headList.size() - 1, 0); sheet.addCell(new Label(0, 0, message, wcf_center)); index = 0; for (String name : headList) { sheet.addCell(new Label(index, 1, name, wcf_center)); index++; } int i = 0; int t = 2; while (flagList <= list.size()) { index = 0; if (i < 65534) { for (String name : headList) { sheet.addCell(new Label(index, t, list.get(flagList - 1).get(name) + "", wcf_center)); index++; } i++; t++; flagList++; } else { break; } } } } book.write(); if (book != null) book.close(); } /** * 檔案下載 * * @param filepath 檔案路徑 * @param response */ public static void send(String filepath, HttpServletResponse response) { try { File file = new File(filepath);// path是檔案地址 String filename = file.getName();// 獲取日誌檔名稱 InputStream fis = new BufferedInputStream(new FileInputStream(filepath)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); response.reset(); // 先去掉檔名稱中的空格,然後轉換編碼格式為utf-8,保證不出現亂碼,這個檔名稱用於瀏覽器的下載框中自動顯示的檔名 response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.replaceAll(" ", "").getBytes("utf-8"), "iso8859-1")); response.addHeader("Content-Length", "" + file.length()); OutputStream os = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); os.write(buffer);// 輸出檔案 os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { List<Map<String, Object>> list = new ArrayList<>(); for (int i = 0; i < 195534; i++) { Map<String, Object> map = new HashMap<>(); map.put("a", "a" + i); map.put("b", "b" + i); map.put("c", "c" + i); map.put("d", "d" + i); list.add(map); } // 首行表頭資訊 List<String> ll = new ArrayList<>(); ll.add("a"); ll.add("b"); ll.add("c"); ll.add("d"); try { CreateExcelFile(list, new File("d:/a.xls"), ll, "單據"); } catch (WriteException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
四、在 Controller 層中如何使用?
程式碼中有解釋
/** * 下載使用者 excle 表介面 * @param response * @throws IOException */ @RequestMapping("/download") public void download(HttpServletResponse response) throws IOException { //可以根據自己的實際情況指定一個地方存放 excle 檔案,記得要檔案的全名 String FILEPATH = "d:/a.xls"; // 判斷 "d:/a.xls" 檔案是否已經存在,如果存在就刪除掉 deleteFile(FILEPATH); // 首行表頭資訊 List<String> ll = new ArrayList<>(); ll.add("使用者ID"); ll.add("使用者賬號"); ll.add("使用者密碼"); ll.add("今日狀態"); ll.add("總簽到次數"); // 獲取所有使用者資訊 List<TUser> allUserList = userService.displayAllUser(); // 將使用者的相關資訊遍歷到 List<Map<String, Object>> 中 List<Map<String, Object>> list = new ArrayList<>(); for (TUser tUser : allUserList) { Map<String, Object> map = new HashMap<>(); map.put("使用者ID", tUser.getUserid()); map.put("使用者賬號", tUser.getUsername()); map.put("使用者密碼", tUser.getPassword()); map.put("今日狀態", tUser.getState()); map.put("總簽到次數", tUser.getCount()); list.add(map); } try { // 第一個引數:表格中的資料 // 第二個引數:表格儲存的路徑 // 第三個引數:表格第二行的列資訊 // 第四個引數:表格第一行的表頭資訊 // 參照效果圖看會清楚些 MakeExcel.CreateExcelFile(list, new File(FILEPATH), ll, "Tell me"); } catch (WriteException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //呼叫瀏覽器下載介面 MakeExcel.send(FILEPATH, response); boolean deleteFileState = deleteFile(FILEPATH); if (deleteFileState) { System.out.println("伺服器上檔案刪除成功!!!"); } else { System.out.println("伺服器上檔案刪除失敗!!!"); } } /** * 刪除單個檔案 * * @param sPath 被刪除檔案的檔名 * @return 單個檔案刪除成功返回true,否則返回false */ public boolean deleteFile(String sPath) { boolean flag = false; File file = new File(sPath); // 路徑為檔案且不為空則進行刪除 if (file.isFile() && file.exists()) { file.delete(); flag = true; } return flag; }
五、測試
先在 tomcat 下跑起來,然後直接呼叫。由於我這裡沒有寫前端,就直接在瀏覽器上輸入連結:http://localhost:8080/sign/download(這是我自己專案的連結,你根據自己的實際專案名稱去改),在瀏覽器上執行之後,瀏覽器會彈出如下的下載視窗。剩下的就跟我們平時在瀏覽器上下載東西一樣了。下載後的表格效果圖在部落格前面已經給了。如果不喜歡這樣的表格,可以自行根據註釋修改。