利用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容器里。