Excel文件导出
1、首先导入依赖jar包
首先需要jar包依赖。POI提供API给Java程序对Microsoft Office格式档案读和写的功能
<!--poi依赖--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10.1</version> </dependency>
2、创建工具类
导入一个接口Constants
package com.zero.util; public interface Constants { public String DATE = "yyyy-MM-dd"; public String DATE_TIME = "yyyy-MM-dd hh:mm:ss"; }
只是定义了两个日期格式。
创建工具类
UserExcelView
这个工具类需要继承特定的抽象类AbstractExcelView
package com.zero.view; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zero.pojo.User; import com.zero.util.Constants; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.joda.time.DateTime; import org.springframework.web.servlet.view.document.AbstractExcelView; public class UserExcelView extends AbstractExcelView { @Override protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { // 从model对象中获取userList @SuppressWarnings("unchecked") List<User> userList = (List<User>) model.get("userList"); // 创建Excel的sheet HSSFSheet sheet = workbook.createSheet("会员列表"); // 创建标题行 HSSFRow header = sheet.createRow(0); header.createCell(0).setCellValue("ID"); header.createCell(1).setCellValue("用户名"); header.createCell(2).setCellValue("姓名"); header.createCell(3).setCellValue("年龄"); header.createCell(4).setCellValue("性别"); header.createCell(5).setCellValue("出生日期"); header.createCell(6).setCellValue("创建时间"); header.createCell(7).setCellValue("更新时间"); // 填充数据 int rowNum = 1; for (User user : userList) { HSSFRow row = sheet.createRow(rowNum); row.createCell(0).setCellValue(user.getId()); row.createCell(1).setCellValue(user.getUserName()); row.createCell(2).setCellValue(user.getName()); row.createCell(3).setCellValue(user.getAge()); String sexStr; if (user.getSex() == 1) { sexStr = "男"; } else if (user.getSex() == 2) { sexStr = "女"; } else { sexStr = "未知"; } row.createCell(4).setCellValue(sexStr); row.createCell(5).setCellValue(new DateTime(user.getBirthday()).toString(Constants.DATE)); row.createCell(6).setCellValue(new DateTime(user.getCreated()).toString(Constants.DATE_TIME)); row.createCell(7).setCellValue(new DateTime(user.getUpdated()).toString(Constants.DATE_TIME)); rowNum++; } // 设置相应头信息,以附件形式下载并且指定文件名 response.setHeader("Content-Disposition", "attachment;filename=" + new String("会员列表.xls".getBytes(),"ISO-8859-1")); } }
AbstractExcelView是springmvc提供的,
在springmvc中
有一个view,它代表视图,json也是属于视图的一种。
继承是为了实现一个方法,buildExcelDocument。这个方法是用来构建Excel的。具体怎么构建不管,只是提供。
exportUser方法将数据装到mv中,然后传到export-user。但是需要对export-user进行配置,因为他不是一个jsp页面,需要在配置文件中进行配置。
<!--配置自定义的视图--> <bean class="com.zero.view.UserExcelView" name="export-user"></bean>
这个时候是找不到export-user视图的
原因:当前的视图解析器是内部资源解析器,会按照下面的方式去查找视图名。
<!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> <property name="order" value="2"></property> </bean>
不满足现在的需求,需要定义其他的视图解析器。目的是可以寻找到自定义的视图。
<!--定义其他的视图解析器:可以寻找到自定义的视图,按照bean的name的属性值,当初一个视图名称去查询视图--> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <!--order表示视图解析器的顺序,值越小优先级越高,默认值是int的最大值,最低--> <!--顺序为先在这个视图解析器找,找不到再去上面找,上面的默认值是int的最大值--> <property name="order" value="1"></property> </bean>
视图解析器可以定义多个。但是视图解析器并不会知道从哪个视图解析器去找,如果不配置order仍然会报错。order是用来给视图解析器排序的。
视图解析器会优先使用优先级高的解析器,如果找不到再依据优先级去其他的视图解析器查找。
坚持就是胜利