利用springMVC把报表以excel的形式导出
自定义视图的作用 自己定义视图,视图继承view类或者abstractExcelView或者abstractPdfView,将内容以Excel或者PDF格式显示,还可以玩表格啊什么的。
实现的步骤
1、在pom.xml文件中加入需要的依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version> </dependency>2、 配置spring-mvc 的配置文件,配置类名解析来找到自定义视图
<bean id ="beanNameViewResolver" class = "org.springframework.web.servlet.view.BeanNameViewResolver"> <!-- value中的值时随便写的,只要比默认值小就行,默认值是一个非常大的数 --> <property name="order" value="50"></property> </bean>3、代码实现
(1)自己定义一个视图类,继承 AbstractXlsxView
package cn.bzu.personalmanage.web; import java.io.OutputStream; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFColorScaleFormatting; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.hssf.util.HSSFColor.RED; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.HorizontalAlignment; 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.Component; import org.springframework.stereotype.Repository; import org.springframework.web.servlet.view.document.AbstractXlsxView; import cn.bzu.personalmanage.entity.Staff; @Component("excelView") public class ExcelView extends AbstractXlsxView { @Override protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { // 视图的名字 String fileName = "UserList.xlsx"; // 设置响应 的字符编码集 response.setCharacterEncoding("UTF-8"); // 设置文件内容的形式 response.setContentType("aplication/ms-excel"); // 设置头部信息 response.setHeader("Content-Disposition", "inline; fileName" + new String(fileName.getBytes(), "UTF-8")); // 接受controller中request请求域中的信息 List<Staff> staffs = (List<Staff>) model.get("staffs"); // 创建一个excel表 Sheet sheet = workbook.createSheet("员工的基本信息"); // 创建第一行 Row headRow = sheet.createRow(0); // 设置第一行各个列的值 headRow.createCell(0).setCellValue("编号"); headRow.createCell(1).setCellValue("姓名"); headRow.createCell(2).setCellValue("年龄"); headRow.createCell(3).setCellValue("性别"); headRow.createCell(4).setCellValue("岗位"); headRow.createCell(5).setCellValue("部门"); headRow.createCell(6).setCellValue("电话"); headRow.createCell(7).setCellValue("学历"); headRow.createCell(8).setCellValue("专业"); headRow.createCell(9).setCellValue("出勤数"); headRow.createCell(10).setCellValue("基本工资"); headRow.createCell(11).setCellValue("奖金"); headRow.createCell(12).setCellValue("补助"); headRow.createCell(13).setCellValue("薪水总数"); headRow.createCell(14).setCellValue("是否在职"); // 创建单元格样式 CellStyle cellStyle = workbook.createCellStyle(); // 左对齐 cellStyle.setAlignment(HorizontalAlignment.RIGHT); int rowNumber = 1; // 循环遍历Staffs for (Staff staff : staffs) { Row row = sheet.createRow(rowNumber); // 为excel表中的每一列进行赋值 row.createCell(0).setCellValue(staff.getId()); row.createCell(1).setCellValue(staff.getName()); row.createCell(2).setCellValue(staff.getAge()); row.createCell(3).setCellValue(staff.getSex()); row.createCell(4).setCellValue(staff.getStation().getStationName()); row.createCell(5).setCellValue(staff.getDepartment().getDpname()); row.createCell(6).setCellValue(staff.getPhone()); row.createCell(7).setCellValue(staff.getEducation()); row.createCell(8).setCellValue(staff.getPrefession()); row.createCell(9).setCellValue(staff.getSalary().getAttendance()); row.createCell(10).setCellValue(staff.getSalary().getBaseSalary()); row.createCell(11).setCellValue(staff.getSalary().getBonus()); row.createCell(12).setCellValue(staff.getSalary().getAllowance()); row.createCell(13).setCellValue(staff.getSalary().getSum()); row.createCell(14).setCellValue(staff.getLeaveOffice().getState()); //对行数自加1 rowNumber++; } // 获得输出流中的内容 OutputStream outputStream = response.getOutputStream(); // 写入 workbook.write(outputStream); outputStream.flush(); outputStream.close(); }2在控制层完成对代码的调用
@RequestMapping("/staffs") public String getAllStaffs(Model model) { //查询到数据库中所有的员工 List<Staff> staffs = staffService.getList(); //将员工信息存放的请求域中 model.addAttribute("staffs", staffs); //返回自己定义的视图 return "excelView"; } 注::这里对ExcelView做出说明 如果要像下面的样子编写Controller类里的方法,即必须在springmvc.xml文件中配置BeanNameViewResolver解析器,通过类名解析来找到自定义视图,注意两点:①return返回的是视图类名首写字母改小写后的名字;②在视图类上要加@Component,要把视图类的对象放Spring容器里。