版权声明:@渔闻520 https://blog.csdn.net/weixin_41060905/article/details/87857323
首先,这是一个非逻辑视图,所以并不需要视图解析器。
还有需要导入POI的api所需要的jar包。
对于Excel而言,SpringMVC推荐使用AbstractXlsView,这是一个抽象类,我们需要去继承(extends)它才能实例化。而且我们仅仅只需要去实现其中的抽象方法buildExcelDocument方法。
先自定义导出接口:
ExcelExportService:
package com.ssm.chapter14.view;
import org.apache.poi.ss.usermodel.Workbook;
import java.util.Map;
//生成excel文件规则
//@param model 数据模型
//@param workbook excel workbook
public interface ExcelExportService {
public void makeWorkBook(Map<String ,Object> model, Workbook workbook);
}
定义Excel视图:
ExcelView继承自 AbstractXlsView:
package com.ssm.chapter14.view;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.StringUtil;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.view.document.AbstractXlsView;
import java.util.Map;
public class ExcelView extends AbstractXlsView {
//文件名
private String fileName=null;
//导出视图自定义接口
private ExcelExportService excelExportService=null;
//构造方法一
public ExcelView(ExcelExportService excelExportService){
this.excelExportService=excelExportService;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public ExcelExportService getExcelExportService() {
return excelExportService;
}
public void setExcelExportService(ExcelExportService excelExportService) {
this.excelExportService = excelExportService;
}
//构造方法二
public ExcelView(String viewName,ExcelExportService excelExportService){
this.setBeanName(viewName);
}
@Override
protected void buildExcelDocument(Map<String, Object> map, Workbook workbook, javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
if (excelExportService == null) {
throw new RuntimeException("导出接口不能为null!");
}
//文件名不能为空,为空使用请求路劲中的字符串作为文件名
if (!StringUtils.isEmpty(fileName)) {//使用spring框架自带的工具类
//进行字符转换
String reqChatset = httpServletRequest.getCharacterEncoding();
reqChatset= reqChatset==null?"utf-8":reqChatset;
fileName=new String(fileName.getBytes(reqChatset),"ISO8859-1");
//设置下面文件
httpServletResponse.setHeader("Content-disposition","attachment;filename="+fileName);
}
//回调接口方法
excelExportService.makeWorkBook(map,workbook);
}
}
其中,buildExcelDocument的方法中的写法是在web端下载文件的常见写法。最后回调自定义的接口的方法。
最后再控制器中:
@RequestMapping(value = "/export",method = RequestMethod.GET)
public ModelAndView export(){
ModelAndView mv = new ModelAndView();
//Excel视图,并设置自定义导出接口
ExcelView ev = new ExcelView(excelExportService());
//文件名
ev.setFileName("所有角色.xls");
//设置SQL后台参数
RoleParams roleParams = new RoleParams();
//限制条数
PageParams page = new PageParams();
page.setStart(0);
page.setLimit(100);
roleParams.setPageParams(page);
List<Role> roleList= roleService.findRoles(roleParams);
//加入数据模型
mv.addObject("roleList",roleList);
mv.setView(ev);
return mv;
}
@SuppressWarnings("unchecked")
private ExcelExportService excelExportService(){
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());
}
};
}
@SuppressWarnings("unchecked") 告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。一般在项目中会出现红色的报错,这个是影响项目运行的,无法启动,会停在那里,而warning警告,黄色的虽然不是会让项目停止,但是却是不规范,留下隐患,而@suppresswarnings就是告诉编译器忽略警告。不用在编译完成后出现警告。
这样就可以从数据库中导出excel视图了。
附上:
<select id="findRoles" parameterType="com.ssm.chapter14.pojo.RoleParams"
resultType="com.ssm.chapter14.pojo.Role">
select id, role_name as roleName, note from t_role
<where>
<if test="roleName != null">
and role_name like concat('%', #{roleName}, '%')
</if>
<if test="note != null">
and note like concat('%', #{note}, '%')
</if>
</where>
limit #{pageParams.start}, #{pageParams.limit}
</select>