一、jxl与POI
优缺点。
二、原生poi
1、导出.xlsx
(1)导包
(2)domain注解
(3)关联导出
2、导入
(1)获取文件
(2)按单元格依次导入
二、easyPOI(重新导包)
1、导出
(1)准备导出按钮(button默认直接提交form表单)
<!-- 这部门是查询的功能 -->
<div>
<form id="searchForm" action="/employee/download" method="post">
用户名: <input name="username" class="easyui-textbox" style="width:80px;height:32px">
邮件: <input name="email" class="easyui-textbox" style="width:80px;height:32px">
部门 :
<input class="easyui-combobox" name="departmentId"
data-options="valueField:'id',textField:'name',panelHeight:'auto',url:'/util/departmentList'">
<a href="#" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查找</a>
<%--导出按钮,button,默认提交表单--%>
<button class="easyui-linkbutton" iconCls="icon-redo">导出</button>
</form>
</div>
(2)根据条件查询,配置视图解析器,导出xlsx文件
配置xml:
<!--导出的视图解析器-->
<context:component-scan base-package="cn.afterturn.easypoi.view"></context:component-scan>
<!-- 优先找easypoi的视图解析器-->
<!-- bean的视图解析器 p:order="0": 顺序在最前面 -->
<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"
p:order="0"></bean>
控制层:
@RequestMapping("/download")
public String download(ModelMap map, EmployeeQuery employeeQuery, HttpServletRequest req){
List<Employee> employees = employeeService.findByQuery(employeeQuery);
//获取上下文路径
String realPath = req.getServletContext().getRealPath("/");
//图片路径处理
for (Employee employee : employees) {
//设置图片绝对路径
String headImage = realPath+employee.getHeadImage();
employee.setHeadImage(headImage);
}
//导出参数设置 ExportParams
ExportParams params = new ExportParams("员工详情","员工信息表",ExcelType.XSSF);
System.out.println("什么错:"+params);
//冻结列
params.setFreezeCol(2);
//导出集合
map.put(NormalExcelConstants.DATA_LIST, employees); // 数据集合
map.put(NormalExcelConstants.CLASS, Employee.class);//导出实体
map.put(NormalExcelConstants.PARAMS, params);//参数
//要求是一个字符串
map.put(NormalExcelConstants.FILE_NAME, "Employee导出");//文件名称
//easypoiExcelView easypoiExcelView --本身spring有一个视图解析器,
//返回字符串就给我返回对应页面
return NormalExcelConstants.EASYPOI_EXCEL_VIEW;//View名称
}
2、导入
(1)MultipartFile接收文件,准备文件接收的表单 import.jsp
前端文件接收:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%@include file="/WEB-INF/views/head.jsp" %>
</head>
<body>
<!-- 上传必需是:post,enctype="multipart/form-data"-->
<form action="/import/employeeXlsx" method="post" enctype="multipart/form-data">
<input class="easyui-filebox" name="empFile" style="width:80%"
data-options="prompt:'选择一个文件...',buttonText: '选择文件'" />
<button class="easyui-linkbutton">导入</button>
</form>
</body>
</html>
(2)验证:导包,domain添加注解
(3)自定义验证:
继承:
@Component
public class AisellEmployeeVerifyHander implements IExcelVerifyHandler<Employee> {
@Autowired
private IEmployeeService employeeService;
@Override
public ExcelVerifyHandlerResult verifyHandler(Employee employee) {
ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true);
boolean checkUsername = employeeService.checkUsername(employee.getUsername());
if(!checkUsername){
result.setSuccess(false);
result.setMsg("用户名已存在");
}
return result;
}
}
(4)导入后保存:
@Controller
@RequestMapping("/import")
public class ImportController {
@Autowired
private IDepartmentService departmentService;
@Autowired
private IEmployeeService employeeService;
//自定义验证类
@Autowired
private AisellEmployeeVerifyHander aisellEmployeeVerifyHander;
//跳转至上传文件页面:
@RequestMapping("/index")
public String index(){
return "import";
}
//1、没有验证功能
@RequestMapping("/employeeXlsx1")
public String importExcel(MultipartFile multipartFile) throws Exception {
//创建输入处理对象
ImportParams params = new ImportParams();
//声明第一行为标题行
params.setTitleRows(1);
//转化上传的文件为Employee对象
List<Employee> employees = ExcelImportUtil.importExcel(multipartFile.getInputStream(), Employee.class, params);
//保存
for (Employee employee : employees) {
//查询部门
Department department = departmentService.findDepartmentByName(employee.getDepartment().getName());
//添加部门
employee.setDepartment(department);
//默认密码添加
employee.setPassword("123456");
//保存
employeeService.save(employee);
}
return "import";
}
//2、具备验证功能
@RequestMapping("/employeeXlsx")
public String employeeXlsx(MultipartFile empFile, HttpServletResponse response) throws Exception {
//这个文件怎么
ImportParams params = new ImportParams();
params.setTitleRows(1);
//开启验证
params.setNeedVerfiy(true);
//开启自定义验证
params.setVerifyHandler(aisellEmployeeVerifyHander);
//导入
ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore(empFile.getInputStream(),
Employee.class, params);
//正确数据
for (Employee employee : result.getList()) {
System.out.println(employee);
//根据部门名称查询的部门对象
String deptName = employee.getDepartment().getName();
Department department = departmentService.findDepartmentByName(deptName);
//设置部门
employee.setDepartment(department);
employee.setPassword("123456");
//System.out.println(employee.getDepartment().getName());
employeeService.save(employee);
}
//错误的数据
for (Employee employee : result.getFailList()) {
System.out.println("错误数据:"+employee);
}
//传回前台 让用户查看 修改
if(result.isVerfiyFail()){
//有时候信息
Workbook failWorkbook = result.getFailWorkbook();
//输出设置一堆参数
//把这个文件导出
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //mime类型
response.setHeader("Content-disposition", "attachment;filename=error.xlsx");
response.setHeader("Pragma", "No-cache");//设置不要缓存
//输出内容
OutputStream ouputStream = response.getOutputStream();
failWorkbook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
}
return "import";
}
}