视图和视图解析器--Excel视图的使用

                                    视图和视图解析器

目前互联网使用的是MVC思想,而Spring MVC是这一思想的完美体现。在MVC中的V就是本文所讨论的地方。当Spring MVC的控制器(controller)获取了对应的数据,绑定了数据模型,就会将数据发送给视图,通过视图进行展示。

为了满足不同需求,Spring MVC提供了多种视图,不论哪种视图,都需要满足视图的定义--View(接口)

常见的视图有:JSTL视图JstlView,JSON视图MappingJacksonJsonView,PDF视图AbstractPdfView,Excel视图AbstractXlsView等。

Excel视图实例:

1.定义一个接口,主要自定义生成Excl的规则,如

package com.ssm.chapter15.view;
import java.util.Map;
import org.apache.poi.ss.usermodel.Workbook;
public interface ExcelExportService {
	/***
	 *  生成exel文件规则
	 * @param model 数据模型
	 * @param workbook excel workbook
	 */
	public void makeWorkBook(Map model, Workbook workbook);
}

 2.创建一个可实例化的Excel视图类--ExcelView

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);
	}

	/*************************setters and getters********************/

	@Override
	protected void buildExcelDocument(Map 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方法,这样就完成了一个视图类。接着我们在角色控制器(controller)中加入新的方法,来满足导出数据的要求(例子中是导出角色)。

@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 roleList = roleService.findRoles(roleParams); 
	//加入数据模型
	mv.addObject("roleList", roleList);
	mv.setView(ev);
	return mv;
}
@SuppressWarnings({ "unchecked"})
private ExcelExportService exportService() {
	//使用Lambda表达式自定义导出excel规则
	return (Map model, Workbook workbook) -> {
		//获取用户列表
    	List roleList = (List) 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

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

你可能感兴趣的:(框架)