导读
在项目中我们经常会遇到Excel文件下载与上传的需求,那么一般都是通过Poi插件来快速实现的,下面介绍常用的做法。
EasyPoi整合SpringBoot 实现Excel文件上传与下载
项目里有个需求,需要实现员工明细列表的查询,并且以Excel文件的方式进行下载并保存到本地。这里就采用EasyPoi来实现。首先导入依赖:
<!-- easypoi 依赖 -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.1.3</version>
</dependency>
接着对与查询返回的实体类注解,需要导出的字段也就是属性,这里用到@Excel与 @ExcelEntity注解,前一个注解基于简单属性,后一个注解需要注解在类上,同时在类的内部注解@Excle,也就是你想导出的字段。
下面我们编写接口:
@ApiOperation(value = "导出员工数据")
@GetMapping(value = "/export",produces = "application/octet-stream")
public void exportEmployee(HttpServletResponse response){
// 获取所有员工信息
List<Employee> employees = employeeService.getEmployee(null);
// 获取导出参数:文件名、表明、导出文件类型
ExportParams params = new ExportParams("员工表","员工表", ExcelType.HSSF);
// 获取工作簿:参数,导出实体类型, 实体集合
Workbook workbook = ExcelExportUtil.exportExcel(params, Employee.class, employees);
// 获取字节输出流
ServletOutputStream out = null;
try {
// 流形式
response.setHeader("content-type","application/octet-stream");
// 防止中文乱码
response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(
"员工表.xls","UTF-8"));
// 输出流
out = response.getOutputStream();
// 写入输出流
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}finally {
if(null != out){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@ApiOperation(value = "导入员工数据")
@PostMapping(value = "/import")
public RespBean importEmployee(MultipartFile file){
// 获得输入参数
ImportParams params = new ImportParams();
// 去掉标题行
params.setTitleRows(1);
List<Nation> nationList = nationService.list();
List<PoliticsStatus> politicsStatusList = politicsStatusService.list();
List<Joblevel> joblevelList = joblevelService.list();
List<Department> departmentList = departmentService.list();
List<Position> positionList = positionService.list();
try {
// 获取员工对象集合
List<Employee> employees = ExcelImportUtil.importExcel(file.getInputStream(), Employee.class, params);
employees.forEach(employee -> {
// 民族 id
employee.setNationId(nationList.get(nationList.indexOf(new Nation(employee.getNation()
.getName()))).getId());
// 政治面貌 id
employee.setPoliticId(politicsStatusList.get(politicsStatusList.indexOf(new PoliticsStatus(employee
.getPoliticsStatus().getName()))).getId());
// 职称 id
employee.setJobLevelId(joblevelList.get(joblevelList.indexOf(new Joblevel(employee.getJoblevel()
.getName()))).getId());
// 部门 id
employee.setDepartmentId(departmentList.get(departmentList.indexOf(new Department(employee
.getDepartment().getName()))).getId());
// 职位 id
employee.setPosId(positionList.get(positionList.indexOf(new Position(employee.getPosition()
.getName()))).getId());
});
// 批量保存
if(employeeService.saveBatch(employees)){
return RespBean.success("导入成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
return RespBean.error("导入失败!");
}