通过自定义的View视图可以让请求直接到一个Excel表去。
自定义的视图必须继承 AbstractXlsView /AbstractXlsxView / AbstractXlsxStreamingView其中的一个抽象类,并实现buildExcelDocument方法;
如果使用的org.springframework.web版本比较老,继承的是AbstractExcelView类,所以说这个类已经过时了。
具体实现:
1.使用Maven或者Gradle导包,这里以Gradle为例。


dependencies {compile group: 'org.springframework', name: 'spring-webmvc', version: '5.0.4.RELEASE'compile group: 'org.springframework', name: 'spring-context', version: '5.0.5.RELEASE'compile group: 'org.springframework', name: 'spring-web', version: '5.0.5.RELEASE'compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'compile group: 'javax.servlet', name: 'jsp-api', version: '2.0'/*poi生成Excel*/compile group: 'org.apache.poi', name: 'poi', version: '4.0.1'compile group: 'org.apache.poi', name: 'poi-ooxml', version: '4.0.1'testCompile group: 'junit', name: 'junit', version: '4.12' }
2.创建一个类:
ViewExcel


import com.lwj.pojo.User; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.web.servlet.view.document.AbstractXlsxView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.util.List; import java.util.Map;public class ViewExcel extends AbstractXlsxView {@Overrideprotected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {String fileName = "账号列表.xlsx";response.setCharacterEncoding("UTF-8");response.setContentType("application/ms-excel");// 文件下载response.setHeader("Content-Disposition", "inline; filename=" + new String(fileName.getBytes(), "iso8859-1"));OutputStream outputStream = response.getOutputStream();Sheet sheet = workbook.createSheet("账号表");Row row = sheet.createRow(0);//设置标头String[] headers = new String[] { "编号", "姓名","密码","年龄" };for (int i = 0; i < headers.length; i++) {row.createCell(i).setCellValue(headers[i]);}List<User> list = (List<User>) model.get("userlist");for (int i = 0; i < list.size(); i++) {User user = list.get(i);row = sheet.createRow(i + 1);row.createCell(0).setCellValue(i + 1);row.createCell(1).setCellValue(user.getName());row.createCell(2).setCellValue(user.getPassWord());row.createCell(3).setCellValue(user.getAge());}workbook.write(outputStream);outputStream.flush();outputStream.close();} }
3.配置自定义视图解析器
<!-- 注册excel视图解析器 --><bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/><bean id="exportExcel" class="com.lwj.custom.view.ViewExcel"/>
4.控制器


package com.lwj.controller;import com.lwj.pojo.User; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping;import java.util.ArrayList; import java.util.List;@Controller @RequestMapping("user") public class UserController {@RequestMapping("excel")public String viewExcel(ModelMap map){List<User> list = new ArrayList<>();User user = new User();user.setName("zs1");user.setPassWord("12345");user.setAge(27);list.add(user);user = new User();user.setName("zs2");user.setPassWord("12346");user.setAge(28);list.add(user);user = new User();user.setName("zs3");user.setPassWord("12347");user.setAge(29);list.add(user);map.put("userlist", list);return "exportExcel";} }
访问控制器的路径就能直接下载Excel表了