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文件的中间插入以下代码:


                
		
			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表格:

SSM 框架整合POI插件技术导出EXCEL文件_第1张图片

浏览器弹窗效果:

SSM 框架整合POI插件技术导出EXCEL文件_第2张图片


版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/mukvintt/article/details/80657769,未经博主允许不得转载。


你可能感兴趣的:(Javaweb)