SpringMVC生成Excel视图

版权声明:@渔闻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>

猜你喜欢

转载自blog.csdn.net/weixin_41060905/article/details/87857323