ssm导出Excel表格

最近在做一个导出Excel表格到客户端的功能,想了一下,好像不能直接导出客户端呀,然后就换一个形式下载到客户端。
写不好的地方,请大神指点指点,thank

代码如下:

1.需要注入POI依赖

<!-- 省略ssm依赖包 -->
		...
<!-- 导出EXCEL表格 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.6</version>
</dependency>

2.定义一个controller处理类

/** * @author zhuangchongyi * @Description: 处理Excel标的的请求类 * @date 2019年9月11日 下午7:58:13 * @version V1.0 */
@Controller
@RequestMapping("/export/")
public class ExportExcelController { 
	@Autowired
	private ArchiveService archiveService;
 
    @RequestMapping("studentArchiveDownload")
	public void exportStudentArchiveDownloadExcel(HttpServletRequest request, HttpServletResponse response)
			throws IOException { 
		response.setCharacterEncoding("UTF-8");
		// 查询学生档案信息
		List<ArchiveStudent> stuArchiveList = archiveService.findArchiveStudentByUserid("1008611");
		int length = stuArchiveList.size(); // 数据行数
		if (stuArchiveList == null || length == 0) { 
			response.getWriter().write("导出失败,暂无数据可导出");
			response.setHeader("refresh", "2;url=http://localhost/MySystem/demo/download.html");
		}

		// 导出存放路径
		String exportPath = request.getSession().getServletContext().getRealPath("excel");
		System.out.println(exportPath);
		File file = new File(exportPath);
		if (file.exists()) { 
			file.mkdirs(); // 创建文件夹
		}
		// 格式化日期
		SimpleDateFormat sdf = new SimpleDateFormat("YYYY年MM月DD日");

		String sheetName = "学生视力档案"; // 底部标题
		String fileName = sheetName + new Date().getTime(); // 文件名称
		String[] title = {  "测试关联id", "创建人", "姓名", "身份证", "性别", "年龄/岁", "身高/cm", "学校", "年级", "班级", "地区", "创建时间" }; // 标题字段
		String[][] values = new String[length][];	//行列值
		for (int i = 0; i < length; i++) { 
			values[i] = new String[title.length];	//行值
			values[i][0] = stuArchiveList.get(i).getSid();
			values[i][1] = stuArchiveList.get(i).getUserid();
			values[i][2] = stuArchiveList.get(i).getName();
			values[i][3] = stuArchiveList.get(i).getUuid();
			values[i][4] = stuArchiveList.get(i).getGender();
			values[i][5] = stuArchiveList.get(i).getAge();
			values[i][6] = stuArchiveList.get(i).getHeight();
			values[i][7] = stuArchiveList.get(i).getSchool();
			values[i][8] = stuArchiveList.get(i).getSgarde();
			values[i][9] = stuArchiveList.get(i).getSclass();
			values[i][10] = stuArchiveList.get(i).getAddress();
			values[i][11] = sdf.format(stuArchiveList.get(i).getCreatetime());
		}
		// 获取HSSFWorkbook 对象
		HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, values, null);
		
		//结合其他的表输出

		String fileName2 = fileName + ".xls";
		boolean flag = ExcelUtil.createExcel(exportPath, fileName2, wb);//导出excel文件
		System.out.println(flag);
		if (flag) { 
			// 创建成功则进行压缩下载
			ZipUtil.setZipDownload(fileName,request,response);
			// 压缩
			String[] fileNameArr = { fileName2};
			ZipUtil.downloadZip(exportPath, fileNameArr, response);//这里已经作出了相应,所以不能再重定向或转发,也不能返回信息,否则会报错
			
			System.out.println("export ok");
			return ;
		} else { 
			System.out.println("export fail");
			return ;
		}

	}
 }

3.定义一个处理Excel表格的工具类

/** * @author zhuangchongyi * @Description: Excel表格导出工具类 * @date 2019年9月12日 上午11:00:19 * @version V1.0 */
public class ExcelUtil { 
	/** * 导出Excel表格 * @param sheetName 表格sheet名称 * @param title 标题数组 * @param values 内容 二维数组 * @param wb HSSFWorkbook对象 * @return */
	public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) { 
		// 1.创建一个HSSWorkbook对象,对应一个Excel文件
		if (wb == null)
			wb = new HSSFWorkbook();
		// 2.在workbook当中添加一个sheet,对应Excel中的sheet
		HSSFSheet sheet = wb.createSheet(sheetName);
		// 3.在sheet表头添加第0行,老版本的poi对Excel的行数有限制
		HSSFRow row = sheet.createRow(0);
		// 4.创建单元格,并设置表头,设置表头居中
		HSSFCellStyle style = wb.createCellStyle();
		// 4.1创建一个居中表格
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 4.2声明列对象
		HSSFCell cell = null;
		// 4.3创建标题
		for (int i = 0; i < title.length; i++) { 
			cell = row.createCell(i);
			cell.setCellValue(title[i]);
			cell.setCellStyle(style);
		}
		// 4.4创建内容
		for (int i = 0; i < values.length; i++) { 
			row = sheet.createRow(i + 1);
			for (int j = 0; j < values[i].length; j++) { 
				// 将内容按顺序赋给对应的列对象
				row.createCell(j).setCellValue(values[i][j]);
			}
		}
		return wb;
	}

	/** * 生成excel表格 * @param exportPath 存放路径 * @param fileName 生成文件名 * @param wb HSSFWorkbook对象 * @return 返回生成是否成功 */
	public static boolean createExcel(String exportPath, String fileName, HSSFWorkbook wb) { 
		boolean flag = false;
		// 解析流
		FileOutputStream fos = null;
		try { 
			File dirFile = new File(exportPath);
			if (!dirFile.exists()) { 
				dirFile.mkdirs();
			}
			fos = new FileOutputStream(exportPath + File.separator + fileName);
			wb.write(fos);
			fos.close();
			flag = true;
		} catch (Exception e) { 
			e.printStackTrace();
			return flag;
		} finally { 
			try { 
				if (fos != null)
					fos.close();
			} catch (IOException e) { 
				e.printStackTrace();
				return flag;
			}
		}
		return flag;
	}

}

4.定义一个压缩成.zip的工具类

/** * @author zhuangchongyi * @Description: 打包成zip工具类 * @date 2019年9月12日 上午10:16:41 * @version V1.0 */
public class ZipUtil { 
	/** * 执行压缩文件 * * @param pathArr * 文件路径数组 * @param nameArr * 文件名数组 * @param response * 响应对象 */
	public static void downloadZip(String path, String[] nameArr, HttpServletResponse response) { 
		ZipOutputStream zipos = null;
		DataOutputStream dos = null;
		try { 
			// 设置压缩流:直接写入response,实现边压缩边下载
			zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
			zipos.setMethod(ZipOutputStream.DEFLATED);// 设置压缩方法

			// 循环将文件写入压缩流
			for (int i = 0; i < nameArr.length; i++) { 
				File file = new File(path + File.separator + nameArr[i]);
				if (file.exists()) {  // 判断文件是否存在
					// 添加ZipEntry,并将其写入文件流
					// 目的是为防止下载的文件时有重名导致下载失败
					zipos.putNextEntry(new ZipEntry(nameArr[i]));
					dos = new DataOutputStream(zipos);
					InputStream in = new FileInputStream(file);
					byte[] b = new byte[1024];
					int len = 0;
					while ((len = in.read(b)) != -1) { 
						dos.write(b, 0, len);
					}
					in.close();
					zipos.closeEntry();
				}

			}

		} catch (Exception e) { 
			e.printStackTrace();
		} finally { 
			try { 
				if (zipos != null)
					zipos.close();
			} catch (Exception e2) { 
				e2.printStackTrace();
			}
		}
	}

	/** * 设置响应为下载格式化,定义下载文件名 * * @param fileName * 文件名 * @param request * @param response */
	public static void setZipDownload(String fileName, HttpServletRequest request, HttpServletResponse response) { 
		// 获取客户端浏览器版本号,协议
		String header = request.getHeader("USER-AGENT");
		try { 
			// 针对IE或者IE内核的浏览器
			if (header.contains("MSIE") || header.contains("Trident")) { 
				fileName = URLEncoder.encode(fileName, "UTF-8");
			} else { 
				// 非IE浏览器的处理
				fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
			}
		} catch (Exception e) { 
			e.printStackTrace();
		}

		// 高速浏览器已下载的形式
		response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".zip");
	}
}

感谢观看

    原文作者:搬砖的小庄啊
    原文地址: https://blog.csdn.net/z13428212556/article/details/100765700
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞