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表格:
瀏覽器彈窗效果: