请求和响应对象
2003版:HSSF
2007版:XSSF
使用JAVA操作EXCEL文件:
输出内容到Excel文件:
Excel文件成为一个工作簿,可以创建多个sheet:工作表,一个工作表有很多行数据:Row,每一行中具有多个列,每一列为一个cell:单元格
1、首先创建2007版的工作簿:workbook
2、通过工作簿创建工作表,可以指定工作表名称,默认为sheet1、sheet2
3、准备数据
4、创建输出流,指定文件名称
5、使用工作簿的write方法传入输出流
6、关流
读取Excel中的内容
1、首先创建2007版的工作簿:workbook
2、通过索引获取到工作表:getSheetAt(0)
3、首选获取总行数,然后编写循环每一行,然后获取当前行的列数,再然后获取当前行的每一个列,最后获取单元格的内容
EasyPOI
1、导包
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.2.0</version>
</dependency>
2、创建domain实体类
通过@Excel注解导入导出数据:
1、@Excel注解的name属性值必须和Excel文件中的表头名称保持一致
2、name属性的值不能有空格
3、必须有无参构造的方法
4、每个字段必须有setget方法
导入数据
@Test
public void testReadExcel() throws Exception{
ImportParams params = new ImportParams();
params.setTitleRows(1);
params.setHeadRows(1);
List<PoiEmployee> list = ExcelImportUtil.importExcel(new FileInputStream("emp.xlsx"), PoiEmployee.class, params);
list.forEach(poiEmployee -> System.out.println(poiEmployee));
}
导出数据
replace属性表示替换:{“男_1”,“女_2”} 表示将1替换成男,将2替换成女
domain:
@Excel(name = "性别",replace = {"男_1","女_2"})
private Integer sex;
@Test
public void testFormat() throws Exception{
//准备数据
List<PoiEmployee> list = new ArrayList<>();
list.add(new PoiEmployee("admin1","admin1@qq.com",31,"财务部",1));
list.add(new PoiEmployee("admin2","admin2@qq.com",27,"财务部",2));
list.add(new PoiEmployee("admin3","admin3@qq.com",25,"IT部",1));
list.add(new PoiEmployee("admin4","admin4@qq.com",29,"IT部",2));
//设置工作簿名称和标题
ExportParams params = new ExportParams();
params.setSheetName("员工列表");
params.setTitle("员工信息");
//使用EasyPoi提供的工具类导出
Workbook workbook = ExcelExportUtil.exportExcel(params,PoiEmployee.class,list);
//将数据填充到Excel中
OutputStream os = new FileOutputStream("员工列表2.xls");
workbook.write(os);
os.close();
workbook.close();
}
日期时间格式化:
只需要在domain实体类的字段上面添加fomat即可
@Excel(name = "生日",format = "yyyy-MM-dd")
private Date birthDay = new Date();
图片处理:
type 属性表示指定导出的数据类型
导出类型:
1是文本 2是图片,3是函数,10是数字 默认是1表示文本
@Excel(name = "头像",type = 2,width = 10,height = 20)
private String image="images/hi.png";
关联对象的属性
首先创建被关联对象的实体类
字段上面添加@Excel注解并指定名称
@Excel(name = "部门名称")
private String name;
关联对象的实体类字段只需要添加@ExcelEntity注解即可
@ExcelEntity
private PoiDepartment department;
Test:
@Test
public void testEmployeeAndDepartment() throws Exception{
PoiDepartment department01 = new PoiDepartment(1L, "喝酒吃肉部");
PoiDepartment department02 = new PoiDepartment(1L, "公关部");
//准备数据
List<PoiEmployee> list = new ArrayList<>();
list.add(new PoiEmployee("admin1","admin1@qq.com",31,"财务部",1,department01));
list.add(new PoiEmployee("admin2","admin2@qq.com",27,"财务部",2,department01));
list.add(new PoiEmployee("admin3","admin3@qq.com",25,"IT部",1,department02));
list.add(new PoiEmployee("admin4","admin4@qq.com",29,"IT部",2,department02));
//设置工作簿名称和标题
ExportParams params = new ExportParams();
params.setSheetName("员工列表");
params.setTitle("员工信息");
//使用EasyPoi提供的工具类导出
Workbook workbook = ExcelExportUtil.exportExcel(params,PoiEmployee.class,list);
//将数据填充到Excel中
OutputStream os = new FileOutputStream("员工列表5.xls");
workbook.write(os);
os.close();
workbook.close();
}
集成SpringMVC
EasyPOI是基于POI而封装出来的一套工具包,其中包含了很多方便实用的工具类,包括与SpringMVC 集成的一些类,这些都被称为view,实际就是Controller类(它是加了@Controller注解的):
EasypoiBigExcelExportView 大数据量导出
EasypoiMapExcelView map 列表导出
EasypoiPDFTemplateView pdf导出
EasypoiSingleExcelView 注解导出
EasypoiTemplateExcelView 模板导出
EasypoiTemplateWordView word模板导出
MapGraphExcelView 图表导出
通过打开这些类发现,上面每一个类中都添加了@Controller注解的,所以我们想要用EasyPOI与 SpringMVC集成的话,就必须扫描包 cn.afterturn.easypoi.view
在SpringMVC.xml中进行扫描包
<context:component-scan base-package="cn.afterturn.easypoi.view"/>
导出数据
1、首先在员工列表上添加导出按钮
<a data-method="export" href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'icon-lala'">导出</a>
2、然后给按钮绑定点击事件,必须使用同步请求,发送的请求可以携带参数,进行高级查询
export:function () {
//GET方式提交请求参数的格式
location.href = "/employee/exportData?" + $("#searchForm").serialize();
},
3、在Controller中添加导出的方法
@RequestMapping("/exportData")
public String exportData(ModelMap map, EmployeeQuery employeeQuery) {
//查询数据,支持高级查询
List<Employee> list = employeeService.findAll(employeeQuery);
//导出参数
ExportParams params = new ExportParams("员工列表", "员工列表", ExcelType.XSSF);
//冻结列
//params.setFreezeCol(2);
map.put(NormalExcelConstants.DATA_LIST, list); //数据集合
map.put(NormalExcelConstants.CLASS, Employee.class); //导出实体
map.put(NormalExcelConstants.PARAMS, params); //导出参数
map.put(NormalExcelConstants.FILE_NAME, "员工列表"); //文件名称
return NormalExcelConstants.EASYPOI_EXCEL_VIEW; //View实体
}
在springMVC.xml中添加视图解析器
此视图解析器优先级高于原先那个视图解析器,也就是说当Controller中方法返回一个字符串的时候,优先使用这个视图解析器来处理,如果这个处理不了再使用原先配置的那个视图解析器
<!-- Bean解析器,级别高于默认解析器,寻找bean对象进行二次处理 -->
<bean id="beanNameViewResolver"
class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0">
</bean>
添加文件上传解析器
<!--文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为10MB -->
<property name="maxUploadSize" value="10485760" />
</bean>
在Employee实体类中字段添加@Excel注解
导入数据
1、创建import.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<meta charset="UTF-8">
<%@include file="/WEB-INF/views/common.jsp"%>
<script type="text/javascript">
$(function () {
$("#btn-submit").click(function () {
$("#ff")[0].submit();
})
});
</script>
</head>
<body>
<form id="ff" method="post" action="/import/importData" enctype="multipart/form-data">
<input class="easyui-filebox" style="width: 300px;" name="excelFile"
data-options="buttonText:'选择文件',prompt:'请选择文件进行导入'"/>
<a id="btn-submit" href="javascript:void(0)" class="easyui-linkbutton"
data-options="iconCls:'icon-redo'">导入</a>
</form>
<span style="color: red">${msg}</span>
</body>
</html>
2、创建importController
excelFile变量名必须与前端表单的name属性保持一致
@Controller
@RequestMapping("/import")
public class importController {
@Autowired
private IDepartmentService departmentService;
@Autowired
private IEmployeeService employeeService;
@RequestMapping("/index")
public String index(){
return "/employee/import";
}
@RequestMapping("/importData")
public String importData(MultipartFile excelFile, HttpServletRequest request) throws Exception{
System.out.println(excelFile.getOriginalFilename());
ImportParams params = new ImportParams();
//标题占1行
params.setTitleRows(1);
//表头占1行,从第三行开始提取数据
params.setHeadRows(1);
List<Employee> list = ExcelImportUtil.importExcel(excelFile.getInputStream(), Employee.class, params);
list.forEach(employee -> {
Department department = departmentService.findByName(employee.getDepartment().getName());
System.out.println(department);
employee.setDepartment(department);
employee.setPassword(MD5Utils.getMD5Password(employee.getUsername()));
employeeService.save(employee);
});
request.setAttribute("msg","导入成功!");
return "employee/import";
}
}
注意:EasyPOI会利用反射创建Employee对象,而Employee类中有一个Department类型的成员变量,所以EasyPOI也会去创建此对象,但是此对象为临时状态,所以此时报错
解决方式:
通过查询department表中的name属性,此时查询到的department就是持久状态的对象
导入验证