SpringMVC-Excel视图的使用
1. 功能介绍
这里的主要功能是:从数据库中导出所有用户的信息,生成一张Excel表。
使用到的视图:AbstractXlsView
1.1. AbstractXlsView介绍
该类实现了视图接口,是一个抽象类,不能生成实例对象,它自己定义了一个抽象方法——buildExcelDocument要去实现。其他的方法Spring的AbstractXlsView已经实现了。所以对于我们而言只需要实现这个方法就可以使用Excel的视图功能了。
1.2. buildExcelDocument方法介绍
方法如下:
/** * 创建excel文件 * @param model——spring mvc数据模型 * @param workbook ——POI workbook对象 * @param httpServletRequest * @param httpServletResponse * @throws Exception */ @Override protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { }
这个方法的主要任务是创建一个Workbook,它要用到POI的API,后面会配上其maven坐标。这里的参数如代码中给出。在SpringMVC中已经对导出Excel做了很多的封装,所以很多细节不需要我们关心。
2. 功能实现
2.1. 导入POI的坐标
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency>
2.2. 创建接口:ExcelExportService
假设需要一个导出所有用户信息的功能,但是将来也许还有其他的导出功能,为了方便,先定义一个接口,这个接口主要是让开发者自定义生成Excel的规则。
public interface ExcelExportService { /** * 自定义生成excel文件的规则 * @param model 数据模型 * @param workbook excel workbook */ public void makeWoorkBook(Map<String,Object> model, Workbook workbook); }
2.3. 创建ExcelView
有了ExcelExportService接口还需一个可实例化的Excel视图类——ExcelView,对于导出而言,还需要一个下载文件名称,所以还会定义一个文件名(FileName属性),由于该视图不是一个逻辑视图,所以无需视图解析器也可以运行。其定义代码如下:
package com.itlearn.excel; import com.itlearn.service.excel.ExcelExportService; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.util.StringUtils; import org.springframework.web.servlet.view.document.AbstractXlsView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; public class ExcelView extends AbstractXlsView { //文件名 private String fileName = null; //导出视图自定义接口 private ExcelExportService exportService; //构造方法 public ExcelView(ExcelExportService exportService){ this.exportService = exportService; } //构造方法2 public ExcelView(String viewName,ExcelExportService exportService){ this.setBeanName(viewName); } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public ExcelExportService getExportService() { return exportService; } public void setExportService(ExcelExportService exportService) { this.exportService = exportService; } @Override protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { //没有自定义的接口 if (exportService ==null){ throw new RuntimeException("导出服务接口不能为null"); } //文件名不为空,为空则使用请求路径中的字符串作为文件名 if (!StringUtils.isEmpty(fileName)){ //进行字符串的转化 String reqCharset = request.getCharacterEncoding(); reqCharset = reqCharset == null?"UTF-8":reqCharset; fileName = new String(fileName.getBytes(reqCharset),"ISO8859-1"); //设置下面文件名 response.setHeader("Content-disposition","attachment;fileName="+fileName); } //回调接口方法,使用自定义生成Excel文档 exportService.makeWoorkBook(model,workbook); } }
这样就可以根据需要进行自定义生成Excel的规则,接着我们需要在用户控制器中加入新的方法,来满足导出所有用户的操作。
2.4. 实现导出Excel
在用户控制器中加入新的方法
***********import************ @Controller public class UserController { @Autowired private IUserService service; @RequestMapping(value = "/export",method = RequestMethod.GET) public ModelAndView export(){ //模型和视图 ModelAndView mv = new ModelAndView(); //Excel视图,并设置自定义导出接口 ExcelView ev = new ExcelView(exportService()); //文件名 ev.setFileName("所有用户.xlsx"); //设置SQL后台参数 //分页 插件 List<User> userList = service.findAll(); //加入到数据模型 中 mv.addObject("userList",userList); mv.setView(ev); return mv; } //使用Lambda表达式实现ExcelExportService接口 public ExcelExportService exportService(){ //使用Lambda表达式自定义导出excel规则 return (Map<String,Object> model, Workbook workbook) ->{ //获取用户列表 List<User> userList = (List<User>) model.get("userList"); //生成sheet Sheet sheet = workbook.createSheet("所有用户"); //加载标题 Row title = sheet.createRow(0); title.createCell(0).setCellValue("编号"); title.createCell(1).setCellValue("用户名"); title.createCell(2).setCellValue("出生日期"); title.createCell(3).setCellValue("性别"); title.createCell(4).setCellValue("地址"); //遍历角色列表,生成一行行数据 for (int i = 0;i<userList.size();i++){ User user = userList.get(i); int userIdx = i+1; Row row = sheet.createRow(userIdx); row.createCell(0).setCellValue(user.getId()); row.createCell(1).setCellValue(user.getUsername()); row.createCell(2).setCellValue(DateFormatUtil.dateToString(user.getBirthday())); row.createCell(3).setCellValue(user.getSex()); row.createCell(4).setCellValue(user.getAddress()); } }; } }
这样就实现了导出Excel,使用Lambda表达式实现ExcelExportService接口(Java8以上)。这里使用了ExcelExportService接口,就可以在自己的控制器上自定义导出规则,根据需要完成开发。