对于Excel而言,Spring MVC所推荐的是使用AbstractXlsView,它实现了视图接口,从其命名也可以知道它只是一个抽象类,不能生成实例对象。它自己定义了一个抽象方法——buildExcelDocument要去实现。其他的方法Spring的AbstractXlsView已经实现了,所以对于我们而言完成这个方法便可以使用Excel的视图功能了
  buildExcelDocument方法的主要任务是创建一个Workbook,它要用到POI的API,这需要我们自行下载并导入项目中。这里的参数在代码中也给出了,在Spring MVC中已经对导出Excel进行了很多的封装,所以很多细节我们并不需要关心。

<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>

  假设需要一个导出所有角色信息的功能,但是将来也许还有其他的导出功能。为了方便,先定义一个接口,这个接口主要是让开发者自定义生成Excel的规则,如代码清单15-46所示。
  代码清单15-46:自定义导出接口定义

package com.ssm.chapter15.view;

import org.apache.poi.ss.usermodel.Workbook;

import java.util.Map;

public interface ExcelExportService {

    /***
* 生成exel文件规则
* @param model 数据模型
* @param workbook excel workbook
*/
public void makeWorkBook(Map<String, Object> model, Workbook workbook); }

  有了这个接口还需要完成一个可实例化的Excel视图类——ExcelView,对于导出而言还需要一个下载文件名称,所以还会定义一个文件名(fileName)属性,由于该视图不是一个逻辑视图,所以无须视图解析器也可以运行它,其定义如代码清单15-47所示。
  代码清单15-47:定义Excel视图

package com.ssm.chapter15.view;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.view.document.AbstractXlsView; public class ExcelView extends AbstractXlsView { //文件名
private String fileName = null; //导出视图自定义接口
private ExcelExportService excelExpService = null; //构造方法1
public ExcelView(ExcelExportService excelExpService) {
this.excelExpService = excelExpService;
} //构造方法2
public ExcelView(String viewName, ExcelExportService excelExpService) {
this.setBeanName(viewName);
} public String getFileName() {
return fileName;
} public void setFileName(String fileName) {
this.fileName = fileName;
} public ExcelExportService getExcelExpService() {
return excelExpService;
} public void setExcelExpService(ExcelExportService excelExpService) {
this.excelExpService = excelExpService;
} @Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { //没有自定义接口
if (excelExpService == 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文档
excelExpService.makeWorkBook(model, workbook);
}
}

  上面的代码实现了生成Excel的buildExcelDocument方法,这样就完成了一个视图类。回调了自定义的接口方法可以根据需要进行自定义生成Excel的规则,接着我们需要在角色控制器中加入新的方法,来满足导出所有角色的要求,如代码清单15-48所示。

  代码清单15-48:使用ExcelView导出Excel

package com.ssm.chapter15.controller;

import com.ssm.chapter15.pojo.PageParams;
import com.ssm.chapter15.pojo.Role;
import com.ssm.chapter15.pojo.RoleParams;
import com.ssm.chapter15.view.ExcelExportService;
import com.ssm.chapter15.view.ExcelView;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView; import java.util.ArrayList;
import java.util.List;
import java.util.Map; @Controller
@RequestMapping("/excel")
public class ExcelController { @RequestMapping(value = "/export", method = RequestMethod.GET)
public ModelAndView export() {
//模型和视图
ModelAndView mv = new ModelAndView();
// Excel视图,并设置自定义导出接口
ExcelView ev = new ExcelView(exportService());
//文件名
ev.setFileName("所有角色.xlsx");
// // 设置SQL后台参数
// RoleParams roleParams = new RoleParams();
// // 限制1万条
// PageParams page = new PageParams();
// page.setStart(0);
// page.setLimit(10000);
// roleParams.setPageParams(page);
// 查询
// List<Role> roleList = roleService.findRoles(roleParams);
List<Role> roleList = new ArrayList<>();
roleList.add(new Role(1l, "射手", "远程物理输出"));
roleList.add(new Role(2l, "法师", "魔法输出"));
// 加入数据模型
mv.addObject("roleList", roleList);
mv.setView(ev);
return mv;
} @SuppressWarnings({"unchecked"})
private ExcelExportService exportService() {
// 使用Lambda表达式自定义导出excel规则
return (Map<String, Object> model, Workbook workbook) -> {
// 获取用户列表
List<Role> roleList = (List<Role>) model.get("roleList");
// 生成Sheet
Sheet sheet = workbook.createSheet("所有角色");
// 加载标题
Row title = sheet.createRow(0);
title.createCell(0).setCellValue("编号");
title.createCell(1).setCellValue("名称");
title.createCell(2).setCellValue("备注");
//便利角色列表,生成一行行的数据
for (int i = 0; i < roleList.size(); i++) {
Role role = roleList.get(i);
int rowIdx = i + 1;
Row row = sheet.createRow(rowIdx);
row.createCell(0).setCellValue(role.getId());
row.createCell(1).setCellValue(role.getRoleName());
row.createCell(2).setCellValue(role.getNote());
}
};
} }

  这样就能够导出Excel了,ExcelExportService接口的实现使用了Lambda表达式,因此Java版本是8及以上,Java 8以下的版本可以使用匿名类的方法去实现它。这里使用了ExcelExportService接口,就可以在自己的控制器上自定义导出规则,这样就可以根据需要开发了。

Spring MVC 实例:Excel视图的使用的更多相关文章

  1. spring mvc:内部资源视图解析器2(注解实现)@Controller/@RequestMapping

    spring mvc:内部资源视图解析器2(注解实现)  @Controller/@RequestMapping 访问地址: http://localhost:8080/guga2/hello/goo ...

  2. spring mvc:内部资源视图解析器(注解实现)@Controller/@RequestMapping

    spring mvc:内部资源视图解析器(注解实现)@Controller/@RequestMapping 项目访问地址: http://localhost:8080/guga2/hello/prin ...

  3. Spring MVC 数据模型与视图

      从控制器获取数据后,会装载数据到数据模型和视图中,然后将视图名称转发到视图解析器中,通过解析器解析后得到最终视图,最后将数据模型渲染到视图中,展示最终的结果给用户. 用ModelAndView来定 ...

  4. spring mvc: 资源绑定视图解析器(不推荐)

    spring mvc: 资源绑定视图解析器(不推荐) 不适合单控制器多方法访问,有知道的兄弟能否告知. 访问地址: http://localhost:8080/guga2/hello/index 项目 ...

  5. Spring MVC资源绑定视图解析器

    ResourceBundleViewResolver使用属性文件中定义的视图bean来解析视图名称. 以下示例显示如何使用Spring Web MVC框架中的ResourceBundleViewRes ...

  6. spring mvc 导出 excel

    // js 触发导出 excel 方法 导出当前页的数据 含有条件查询的结果 // js 框架使用的 是 easyui function doExport(){ var optins = $(&quo ...

  7. [Spring MVC] - JSP + Freemarker视图解释器整合

    Spring MVC中如果只使用JSP做视图,可以使用下面这段即可解决: <!-- 视图解释类 --> <bean class="org.springframework.w ...

  8. spring mvc的excel报表文件下载时流的冲突解决

    在jsp或者在servlet中有时要用到 response.getOutputStream(),但是此时会在后台报这个错误java.lang.IllegalStateException: getOut ...

  9. spring mvc velocity多视图

    1.ViewResolverUrlBasedViewResolver 这个东西是根据url 进行路由的.网上搜了 1.order 排序,同名出现各种问题 2.XmlViewResolver,BeanN ...

随机推荐

  1. C++创建对象的3种方式(转载)

    #include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~ ...

  2. NIO原理详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/CharJay_Lin/article/d ...

  3. 计算 byte[] 转 int modebus 指定位数 获取值 使用

    计算 byte[] 转 int modebus 指定位数 获取值 使用 if (bytetores.Length > 6) { int total = 0; for (int i = 0; i ...

  4. YAML_04 用user模块添加用户,并修改密码

    ansible]# vim user.yml --- - hosts: cache   remote_user: root   vars:     username: lisi   tasks:   ...

  5. noi.ac #30 思维

    \(des\) 给定升序数组 \(A, B\) 对于任意两个集合 \(a, b\) 分别是 \(A, B\) 的子集,总价值为较小的集合的和, 总代价为 \((|a| + |b|) \times w\ ...

  6. CF1163E Magical Permutation【线性基,构造】

    题目描述:输入一个大小为\(n\)的正整数集合\(S\),求最大的\(x\),使得能构造一个\(0\)到\(2^x-1\)的排列\(p\),满足\(p_i\oplus p_{i+1}\in S\) 数 ...

  7. 关于nginx反代jenkins报错 反向代理设置有误

    官方文档地址: https://wiki.jenkins.io/display/JENKINS/Running+Jenkins+behind+Nginx 直接解决的配置文件吧. 这是使用子域名,不使用 ...

  8. Pytest权威教程07-Monkeypatching,对模块和环境进行Mock

    目录 Monkeypatching,对模块和环境进行Mock 简单示例如: 猴子补丁方法 Monkeypatching 返回对象: 构建mock类 全局补丁示例如:阻止"requests&q ...

  9. OpenFOAM当中监测力和阻力系数

    首先准备好我们自己的平常算例文件,本次我们以圆柱绕流的算例来说明用法 我们找到constant文件夹 打开其中的transportProperties文件 我们将其中的: nu             ...

  10. ubuntu之路——day6(今天对数据集的建立有了更深的体会)

    两个重点: 一.举个例子,如果建立一个图像识别的数据集,你的训练集和你的训练验证集是从网上爬下来的(也就是说这些图片的大小.像素.后期制作都可能很精美),你真正的测试集是用户的手机上传(不同的手机.环 ...