1. 程式人生 > >SSM 框架整合POI外掛技術匯出EXCEL檔案

SSM 框架整合POI外掛技術匯出EXCEL檔案

前言

本次實踐的專案過程當中,對於基於SSM框架實現的專案過程,其中涉及到了前端匯出EXCEL的過程進行整理和彙總,同時對於在網上查詢到的資料等進一步進行解釋和理解,對於網路中的資料,總是會有些不適合自己專案的地方,這個也是大家在學習過程當中會遭遇到,因為別人描述的問題,是他遇到的,而這次個人遇見,總結了下,可能會是大家都能遇見的實現較為複雜的SQL拼接出來的實現的表格匯出下載成為EXCEL檔案。

由於自己也是小白,總是磕磕碰碰在別的大佬的幫助下才是最終完成了,自己也就是看個明白,不過,自己也是必須要更好的理解和實踐,以後的開發過程當中,才能是融匯貫通。

環境介紹

本次專案是完全的基於Spring + Springmvc + Mybatis + POI + MAVEN 的校驗工具的專案。

主要講解的位置

由於涉及匯出的是複雜SQL拼接的內容,所以網上一般試用的想要實踐匯出EXCEL檔案,自己卻是找到了是需要先設定一個匯出的Model,然後運用POI外掛,等,如果大家有搜尋的話,都會知道,但是這個並不適用自己,在請教了H姓大佬之後,才是明白了自己其實想差了,只要去見前臺點選操作觸發了後臺的SQL語句,將獲取的內容,直接就是封裝成程式碼實現的EXCEl檔案流即可(這裡可能表述不太準確,現在馬上開始進入正題)。

其實實現過程是非常簡單的。

第一步:既然是基於maven的環境,那麼poi的外掛必須要在POM.xml檔案當中匯入才行。

POM.xml檔案的<dependencies></dependencies>

中間插入以下程式碼:


                <!--excel解析poi包-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.9</version>
		</dependency>
		
		<!--excel解析poi包-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.9</version>
		</dependency>

第二步:前端設定觸發匯出EXCEL的檔案按鈕(前端jsp檔案)

<div id="iframe_home" class="iframe cur">
    <a class="waves-effect btn btn-info btn-sm" href="javascript:ExToExcel();" >
    <i class="zmdi zmdi-plus"></i> 匯出Excel</a>
	<table id="table"></table>
</div>

其中,設定一處專門的“匯出EXCEL”檔案按鈕,路上,並且該<div></div>中,存放的是要匯出的表格“table”(其實該位置不重要,只是為了方便大家看見了我是將table檔案放在了和 “ 匯出EXCEL ”按鈕一處)。

其中設定觸發的函式為:

href="javascript:ExToExcel();

也即需要在

<script type="text/javascript"></script> 

中間插入一個函式體,名為ExToEXCEL()

ExToEXCEL()函式如下:

//匯出Excel
var Name = '${user.userName}'
function ExToExcel() {
	$.confirm({
		title: '匯出Excel',
		buttons: {
			confirm: {
				text: '匯出',
	        action: function () {
	            location.href="${pageContext.request.contextPath}/common/checked/ExcelOut?Name="+Name
			}
			},
			cancel: {
				text: '取消',
			}}
	});

其中,因為是要根據使用者去檢索獲取表格,所以這裡定義個一個獲取使用者名稱(其實根據條件,如果該匯出excel的許可權每個人都擁有的話,該方法定義什麼都是可以,只不過一般想到的是用Name

第三步:根據以上前端寫到的是用

location.href="${pageContext.request.contextPath}/common/checked/ExcelOut?Name="+Name

那麼我們就要在後臺的一個Controller類中,去編寫匯出程式碼了。

(注,這裡使用的是註解開發,所以,如果你在哪個Controller類中,初始位置上去找到有/common/checked/就可以去寫匯出方法了)

而這裡,我是寫在了Common資料夾下的CheckedController類中。


,那麼接下來就是要寫匯出方法了,也即要在該方法上寫上

@RequestMapping(value = "/ExcelOut", method = RequestMethod.GET)

程式碼本體如下:

@RequestMapping(value = "/ExcelOut", method = RequestMethod.GET)
@ResponseBody
public void ExcelOut(String Name, HttpServletRequest request, HttpServletResponse response) throws IOException {
	Map<String, String> parameterMap = new HashMap<>();

	// 建立一個檔案
	String path = this.getStringDate() + "_" + Name + ".xlsx";//建立檔名,使用的是日期加’_’加使用者名稱+字尾名,如果使用此處要改
	System.out.println(path);
	parameterMap.put("userId", this.getSessionUser().getUserId());
	List<HashMap<String, Object>> lists = delegateMapper
		.selectList("com.XXXX.dao.checkedlog.mapper.CheckedLogMapper.getSummaryinfo");
	String[] title = { "使用者名稱","時間",  "上傳數", "總上傳數" };//設定EXCEL的第一行的標題頭(改)
	// 建立excel工作薄
	XSSFWorkbook workbook = new XSSFWorkbook();
	// 建立一個工作表sheet
	XSSFSheet sheet = workbook.createSheet();
	// 建立第一行
	XSSFRow row = sheet.createRow(0);
	XSSFCell cell = null;

	// 插入第一行資料 id 地區名稱
	for (int i = 0; i < title.length; i++) {
	    // 建立一行的一格
	    cell = row.createCell(i);
	    // 賦值
	    cell.setCellValue(title[i]);
	}
	// 追加資料行數
	int j = 1;
	HashMap<String, Object> list = null;
	for (int i = 0; i < lists.size(); i++) {
	    // 從集合中得到一個物件
	    list = lists.get(i);
	    // 建立第2行

	    XSSFRow nextrow = sheet.createRow(i+1);
	    // 建立第1列並賦值
	    XSSFCell cessk = nextrow.createCell(0);
	    cessk.setCellValue((String) list.get("USER_NAME"));//改

	    cessk = nextrow.createCell(1);
	    cessk.setCellValue((String) list.get("TIME"));//改

	    cessk = nextrow.createCell(2);
	    cessk.setCellValue(Integer.parseInt(new java.text.DecimalFormat("0").format(list.get("upload"))));//改

	    cessk = nextrow.createCell(3);
	    cessk.setCellValue(Integer.parseInt(new java.text.DecimalFormat("0").format(list.get("TotalUpload"))));//改
            //可自己再按照需要新增函式,注意將cessk = nextrow.createCell(num);這其中的num修改就行,按照順序加上1就行
	    j++;
	}
	if (path.equals("")) {
		response.getWriter().write("失敗,失敗原因:引數為空!");
		return;
	}
	response.setContentType("application/vnd.ms-excel");
	response.setHeader("Content-disposition", "attachment;filename="+path);
	OutputStream ouputStream;
	try {
	    ouputStream = response.getOutputStream();
	    workbook.write(ouputStream);
	    ouputStream.flush();
	    ouputStream.close();
	} catch (IOException e) { 
	}
}
(注:程式碼本體中後的//改 就是要修改就可以使用了)

第四步,注意到,呼叫了

List<HashMap<String, Object>> lists = delegateMapper
				.selectList("com.XXXX.dao.checked.mapper.CheckedMapper.getSummaryinfo");

就是要查詢到後臺資料庫的資料,而該

CheckedMapper.xml

的就是要寫我們使用複雜SQL找出來的複雜資料,將其封裝成一個數據集,然後接下來就是由第三步中的後面的程式碼進行匯出成EXCEL檔案。

以下就是設計了三重的巢狀,使用資料庫將資料進行了行轉列的複雜SQL,具體的大家可以自行百度下,什麼是MYSQL得行轉列,可以學習以下。

<select id="getSummaryinfo" resultType="java.util.Map"> 
select USER_NAME , YEAR_MONTHS, 
sum(upload) as upload, 
sum(Totalupload) as Totalupload, 

from
 ( 
 select USER_NAME, YEAR_MONTHS ,

 case when JOB_TYPE='上傳' then TOTAL else 0  end as upload, 
 case when JOB_TYPE='上傳' then upTOTALelse 0  end as Totalupload, 
from 
 ( select sum(now_stage) as TOTAL, sum(all_stage) as upTOTAL,JOB_TYPE, USER_NAME, date_format( end_Time,'%Y-%m') as YEAR_MONTHS 
 from 
jobs group by user_NAME, date_format(end_Time,'%Y-%m') ,jobtype) A ) B group by user_NAME, YEAR_MONTHS desc
 </select>

最終得到的結果截圖如下:

匯出的EXCEl表格:


瀏覽器彈窗效果: