com.alibaba
easyexcel
3.0.5
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
private String sex;
private String uno;
}
//Bean拷贝工具类封装(对象复制,复制共有的字段)
public class BeanCopyUtils {
private BeanCopyUtils() {
}
//单个对象的拷贝
public static V copyBean(Object source,Class clazz) {
//利用反射来创建接收对象
//创建目标对象
V result = null;
try {
result = clazz.newInstance();
//实现属性copy
BeanUtils.copyProperties(source, result);
} catch (Exception e) {
e.printStackTrace();
}
//返回结果
return result;
}
public static List copyBeanList(List list, Class clazz){
return list.stream()
.map(o -> copyBean(o, clazz))//对象的转换,将每个对象都进行拷贝
.collect(Collectors.toList());
}
}
public class WebUtils
{
/**
* 将字符串渲染到客户端
*
* @param response 渲染对象
* @param string 待渲染的字符串
* @return null
*/
public static void renderString(HttpServletResponse response, String string) {
try
{
response.setStatus(200);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().print(string);
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void setDownLoadHeader(String filename, HttpServletResponse response)throws UnsupportedEncodingException {
response.setContentType("application/vnd.openxmlformats- officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fname= URLEncoder.encode(filename,"UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition","attachment; filename="+fname);
}
}
1) 配置Excel导出实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExcelExportVo {
@ExcelProperty("学号")//导出为Excel文件时该字段的列名
private String uno;//必须与实体类字段名称保持一致
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("性别")
private String sex;
}
2)控制层方法
@GetMapping("/exportExcel")
public void exportExcel(HttpServletResponse response){
try {
//设置下载文件的请求头
WebUtils.setDownLoadHeader("学生信息导出.xlsx",response);
//获取需要导出的数据
List studentList = studentService.list();//查找全部信息的方法,按照自己的项目编写
List excelStudentVos = BeanCopyUtils.copyBeanList(studentList, ExcelExportVo.class);//对象拷贝
//把数据写入到Excel中
EasyExcel.write(response.getOutputStream(), ExcelExportVo.class).autoCloseStream(Boolean.FALSE).sheet("学生信息导出")
.doWrite(excelStudentVos);
} catch (Exception e) {
//如果出现异常也要响应json
ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR);//json形式的错误提示信息,按照自己的项目编写
WebUtils.renderString(response, JSON.toJSONString(result));
}
}
1) 配置Excel导入实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
//该实体类有几个字段,导入的Excel文件也只能有几列,且列名与注解值必须保持一致
public class ExcelImportVo {
@ExcelProperty("学号")//导入的Excel文件的列名必须与该注解的名称保持一致
private String uno;//必须与实体类字段名称保持一致
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("性别")
private String sex;
}
2) 配置监听器,在监听器里将数据解析出来执行业务逻辑
@Slf4j
public class ExcelImportListenerStudent extends AnalysisEventListener {
@Resource
private StudentMapper studentMapper;//根据自己的业务需要设置,但是必须由构造函数传入,否则对象为空
//构造函数,设置属性值,有几个属性就传入几个,根据自己的业务需要设置
public ExcelImportListenerStudent(StudentMapper studentMapper) {
this.studentMapper = studentMapper;
}
//具体的业务操作,按照自己的形目需求,这边以新增举例
@Override
public void invoke(ExcelImportVo excelImportVo, AnalysisContext analysisContext) {
log.info("解析到一条数据:{}", JSON.toJSONString(excelImportVo));
Student student = BeanCopyUtils.copyBean(excelImportVo, Student.class);
System.out.println("导入学生信息:"+student);
studentMapper.insert(student);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("所有数据解析完成!");
}
}
3)控制层方法
@PostMapping("/excel/import")
public ResponseResult importData(MultipartFile file){//返回类型按自己的项目需求来定义
try {
System.out.println("导入数据");
EasyExcel.read(file.getInputStream(), ExcelImportVo.class,new ExcelImportListenerStudent(studentMapper)).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
return ResponseResult.okResult();
}