1. 程式人生 > >Java 從資料庫中匯出 Excle 表

Java 從資料庫中匯出 Excle 表

目錄

 

一、效果圖

二、excle 生成的工具類原理

三、excle 生成的工具類原始碼

四、在 Controller 層中如何使用?

五、測試


一、效果圖

二、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(這是我自己專案的連結,你根據自己的實際專案名稱去改),在瀏覽器上執行之後,瀏覽器會彈出如下的下載視窗。剩下的就跟我們平時在瀏覽器上下載東西一樣了。下載後的表格效果圖在部落格前面已經給了。如果不喜歡這樣的表格,可以自行根據註釋修改。