前言
本次实践的项目过程当中,对于基于SSM框架实现的项目过程,其中涉及到了前端导出EXCEL的过程进行整理和汇总,同时对于在网上查找到的资料等进一步进行解释和理解,对于网络中的资料,总是会有些不适合自己项目的地方,这个也是大家在学习过程当中会遭遇到,因为别人描述的问题,是他遇到的,而这次个人遇见,总结了下,可能会是大家都能遇见的实现较为复杂的SQL拼接出来的实现的表格导出下载成为EXCEL文件。
由于自己也是小白,总是磕磕碰碰在别的大佬的帮助下才是最终完成了,自己也就是看个明白,不过,自己也是必须要更好的理解和实践,以后的开发过程当中,才能是融汇贯通。
环境介绍
本次项目是完全的基于Spring + Springmvc + Mybatis + POI + MAVEN 的校验工具的项目。
主要讲解的位置
由于涉及导出的是复杂SQL拼接的内容,所以网上一般试用的想要实践导出EXCEL文件,自己却是找到了是需要先设置一个导出的Model,然后运用POI插件,等,如果大家有搜索的话,都会知道,但是这个并不适用自己,在请教了H姓大佬之后,才是明白了自己其实想差了,只要去见前台点击操作触发了后台的SQL语句,将获取的内容,直接就是封装成代码实现的EXCEl文件流即可(这里可能表述不太准确,现在马上开始进入正题)。
其实实现过程是非常简单的。
第一步:既然是基于maven的环境,那么poi的插件必须要在POM.xml文件当中导入才行。
在POM.xml文件的
org.apache.poi
poi-ooxml
3.9
org.apache.poi
poi
3.9
第二步:前端设置触发导出EXCEL的文件按钮(前端jsp文件)
其中,设置一处专门的“导出EXCEL”文件按钮,路上,并且该
中,存放的是要导出的表格“table”(其实该位置不重要,只是为了方便大家看见了我是将table文件放在了和 “ 导出EXCEL ”按钮一处)。其中设置触发的函数为:
href="javascript:ExToExcel();
也即需要在
中间插入一个函数体,名为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 parameterMap = new HashMap<>();
// 创建一个文件
String path = this.getStringDate() + "_" + Name + ".xlsx";//创建文件名,使用的是日期加’_’加用户名+后缀名,如果使用此处要改
System.out.println(path);
parameterMap.put("userId", this.getSessionUser().getUserId());
List> 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 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> lists = delegateMapper
.selectList("com.XXXX.dao.checked.mapper.CheckedMapper.getSummaryinfo");
就是要查找到后台数据库的数据,而该
CheckedMapper.xml
的就是要写我们使用复杂SQL找出来的复杂数据,将其封装成一个数据集,然后接下来就是由第三步中的后面的代码进行导出成EXCEL文件。
以下就是设计了三重的嵌套,使用数据库将数据进行了行转列的复杂SQL,具体的大家可以自行百度下,什么是MYSQL得行转列,可以学习以下。
最终得到的结果截图如下:
导出的EXCEl表格:
浏览器弹窗效果: