easypoi的简单实践实例
程序员文章站
2022-07-10 21:43:15
1前言:Excel大家肯定很熟知,但是怎么样用Java代码与Excel表格进行数据交互呢,现在比较主流的有阿帕奇原生poi,还有基于阿帕奇进行封装的easypoi和阿里巴巴的easyExcel等等,前段时间做业务用easypoi,感觉爽歪歪,所以简单介绍一下。1.1 内容提要:主要写一下带有照片的Excel的导出和带有照片的Excel的导出2 easypoi的基础知识2.1 导入依赖 ...
1前言:Excel大家肯定很熟知,但是怎么样用Java代码与Excel表格进行数据交互呢,现在比较主流的有阿帕奇原生poi,还有基于阿帕奇进行封装的easypoi和阿里巴巴的easyExcel等等,前段时间做业务用easypoi,感觉爽歪歪,所以简单介绍一下。
1.1 内容提要:主要写一下带有照片的Excel的导出和带有照片的Excel的导入
2 easypoi的基础知识
2.1 导入依赖
<!-- 做此业务是用的springboot版本 2.1.5.RELEASE -->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.1.2</version>
</dependency>
2.2使用easypoi你必须知道的几个事情
2.2.1常用注解
- @ExcelIgnore:用在实体类上,表示不属于Excel表格中字段。
- 更多注解,请查看官网,因为自己没有实践,不敢妄加评论
- @Excel:用字实体类上的属性上,以下介绍一下注解的属性值得用法
属性 | 类型 | 类型 | 说明 |
---|---|---|---|
name | String | null | 列名 |
needMerge | boolean | fasle | 纵向合并单元格 |
orderNum | String | “0” | 列的排序,支持name_id |
replace | String[] | {} | 值得替换 导出是{excel表格值_数据库中值,a_id,b_id} 导入反过来 |
savePath | String | “upload” | 导入文件保存路径 |
type | double | 1 | 导出类型 1 是文本(默认1), 2 是图片,3 是函数,10 是数字 |
imageType | int | 1 | 导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的 |
width | double | 10 | 列宽 |
height | double | 10 | 列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意 |
isStatistics | boolean | fasle | 自动统计数据,在追加一行统计,把所有数据都和输出这个处理会吞没异常,请注意这一点 |
isHyperlink | boolean | false | 超链接,如果是需要实现接口返回对象 |
isImportField | boolean | true | 校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id |
exportFormat | String | “” | 导出的时间格式,以这个是否为空来判断是否需要格式化日期 |
importFormat | String | “” | 导入的时间格式,以这个是否为空来判断是否需要格式化日期 |
format | String | “” | 时间格式,相当于同时设置了exportFormat 和 importForma |
databaseFormat | String | yyyyMMddHHmmss | 导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string类型,这个需要设置这个数据库格式,用以转换时间格式输出 |
numFormat | String | “” | 数字格式化,参数是Pattern,使用的对象是DecimalFormat |
suffix | String | “” | 文字后缀,如% 90 变成90% |
isWrap | boolean | true | 是否换行 即支持\n |
mergeRely | int[] | {} | 合并单元格依赖关系,比如第二列合并是基于第一列 则{1}就可以了 |
mergeVertical | boolean | fasle | 纵向合并内容相同的单元格 |
2.2.2一个导入导出util,用这个准没错
package com.per.easypoi.utils;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.handler.inter.IExcelExportServer;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;
/**
* excel 工具类
*
* @author lys
* @date 2020/11/14
*/
public class ExcelUtils {
/**
* 导出excel到
*
* @param list 数据
* @param title 表头
* @param sheetName sheetName
* @param pojoClass 解析的对象类型
* @param fileName 文件名称
* @param isCreateHeader 是否创建表头
* @return 文件路径
*/
public static String exportExcelToFile(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader) {
OutputStream out = null;
Workbook workbook = null;
try {
ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
exportParams.setCreateHeadRows(isCreateHeader);
fileName = encodingFilename(fileName);
out = new FileOutputStream(getAbsoluteFile(fileName));
workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
workbook.write(out);
return fileName;
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
} finally {
if (workbook != null) {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* excel 导出到文件
*
* @param list 数据
* @param title 表头
* @param sheetName sheet名称
* @param pojoClass pojo类型
* @param fileName 文件名
* @return 文件路径
*/
public static String exportExcelToFile(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName) {
return exportExcelToFile(list, title, sheetName, pojoClass, fileName, true);
}
/**
* excel 导出到文件
*
* @param list 数据
* @param title 表头
* @param sheetName sheet名称
* @param pojoClass pojo类型
* @return 文件路径
*/
public static String exportExcelToFile(List<?> list, String title, String sheetName, Class<?> pojoClass) {
return exportExcelToFile(list, title, sheetName, pojoClass, title, true);
}
/**
* excel 导出到文件
*
* @param list 数据
* @param fileName 文件名
* @param pojoClass pojo类型
* @return 文件路径
*/
public static String exportExcelToFile(List<?> list, String fileName, Class<?> pojoClass) {
return exportExcelToFile(list, fileName, fileName, pojoClass, fileName, true);
}
/**
* excel 导出
*
* @param list 数据
* @param title 标题
* @param sheetName sheet名称
* @param pojoClass pojo类型
* @param fileName 文件名称
* @param isCreateHeader 是否创建表头
* @param response
*/
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) throws IOException {
ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
exportParams.setCreateHeadRows(isCreateHeader);
defaultExport(list, pojoClass, fileName, response, exportParams);
}
/**
* excel 大数据的导出
* @param title 标题
* @param sheetName sheet名称
* @param iExcelExportServer 查询数据的接口
* @param pojoClass pojo类型
* @param response
* @param fileName 文件名称
* @param isCreateHeader 是否创建表头
* @param queryParams 查询数据的参数
* @throws IOException
*/
public static void exportBigExcel(String title,String sheetName,
IExcelExportServer iExcelExportServer,Class<?> pojoClass,HttpServletResponse response,
String fileName, boolean isCreateHeader,Object queryParams) throws IOException {
ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
exportParams.setCreateHeadRows(isCreateHeader);
defaultBigExport(exportParams, iExcelExportServer, pojoClass, response, fileName,queryParams);
}
/**
*
* @param exportParams
* @param iExcelExportServer
* @param pojoClass
* @param response
* @param fileName
* @param queryParams
* @throws IOException
*/
private static void defaultBigExport(ExportParams exportParams,
IExcelExportServer iExcelExportServer,Class<?> pojoClass,HttpServletResponse response,
String fileName,Object queryParams) throws IOException {
Workbook workbook = ExcelExportUtil.exportBigExcel(exportParams, pojoClass, iExcelExportServer, queryParams);
downLoadExcel(fileName, response, workbook);
}
/**
* excel 导出
*
* @param list 数据
* @param title 标题
* @param sheetName sheet名称
* @param pojoClass pojo类型
* @param fileName 文件名称
* @param response
*/
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException {
defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName, ExcelType.XSSF));
}
/**
* excel 导出
*
* @param list 数据
* @param pojoClass pojo类型
* @param fileName 文件名称
* @param response
* @param exportParams 导出参数
*/
public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException {
defaultExport(list, pojoClass, fileName, response, exportParams);
}
/**
* excel 导出
*
* @param list 数据
* @param fileName 文件名称
* @param response
*/
public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
defaultExport(list, fileName, response);
}
/**
* 默认的 excel 导出
*
* @param list 数据
* @param pojoClass pojo类型
* @param fileName 文件名称
* @param response
* @param exportParams 导出参数
*/
private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) throws IOException {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
downLoadExcel(fileName, response, workbook);
}
/**
* 默认的 excel 导出
*
* @param list 数据
* @param fileName 文件名称
* @param response
*/
private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
downLoadExcel(fileName, response, workbook);
}
/**
* 下载
*
* @param fileName 文件名称
* @param response
* @param workbook excel数据
*/
private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
try {
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
throw new IOException(e.getMessage());
}
}
/**
* excel 导入
*
* @param filePath excel文件路径
* @param titleRows 标题行
* @param headerRows 表头行
* @param pojoClass pojo类型
* @param <T>
* @return
*/
public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
if (StringUtils.isBlank(filePath)) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(0);
params.setHeadRows(headerRows);
params.setNeedSave(true);
//params.setSaveUrl("/excel/");
try {
return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
} catch (NoSuchElementException e) {
throw new IOException("模板不能为空");
} catch (Exception e) {
throw new IOException(e.getMessage());
}
}
/**
* excel 导入 不使用常规校验
*
* @param file excel文件
* @param pojoClass pojo类型
* @param <T>
* @param iExcelVerifyHandler 自定义校验 不使用设置为null
* @return
*/
public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass,IExcelVerifyHandler iExcelVerifyHandler) throws IOException {
return importExcel(file, 1, 1, pojoClass,iExcelVerifyHandler);
}
/**
* excel 导入 不使用常规校验
*
* @param file excel文件
* @param titleRows 标题行
* @param headerRows 表头行
* @param pojoClass pojo类型
* @param <T>
* @param iExcelVerifyHandler 自定义校验 不使用设置为null
* @return
*/
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass,IExcelVerifyHandler iExcelVerifyHandler) throws IOException {
return importExcel(file, titleRows, headerRows, false, pojoClass, iExcelVerifyHandler);
}
/**
* excel 导入
*
* @param file 上传的文件
* @param titleRows 标题行
* @param headerRows 表头行
* @param needVerify 是否检验excel内容 不使用设置为false
* @param pojoClass pojo类型
* @param <T>
* @param iExcelVerifyHandler 自定义校验 不使用设置为null
* @return
*/
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerify, Class<T> pojoClass,IExcelVerifyHandler iExcelVerifyHandler) throws IOException {
if (file == null) {
return null;
}
try {
return importExcel(file.getInputStream(), titleRows, headerRows, needVerify, pojoClass, iExcelVerifyHandler);
} catch (Exception e) {
throw new IOException(e.getMessage());
}
}
/**
* excel 导入
*
* @param inputStream 文件输入流
* @param titleRows 标题行
* @param headerRows 表头行
* @param needVerify 是否检验excel内容 不使用设置为false
* @param pojoClass pojo类型
* @param <T>
* @param iExcelVerifyHandler 自定义校验 不使用设置为null
* @return
*/
public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerify, Class<T> pojoClass,IExcelVerifyHandler iExcelVerifyHandler) throws IOException {
if (inputStream == null) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
//保存传上来的excel,图片的路径
params.setSaveUrl("excel/");
//是否保存传上来的excel,图片,false表示不保存
params.setNeedSave(false);
//检验,不使用设置为false
params.setNeedVerify(needVerify);
//自定义检验,不使用设置为null
params.setVerifyHandler(iExcelVerifyHandler);
try {
return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
} catch (NoSuchElementException e) {
throw new IOException("excel文件不能为空");
} catch (Exception e) {
throw new IOException(e.getMessage());
}finally {
inputStream.close();
}
}
/**
* 获取下载路径
*
* @param downloadPath 文件名称
*/
private static String getAbsoluteFile(String downloadPath) {
downloadPath = "/excel/" + downloadPath;
File desc = new File(downloadPath);
if (!desc.getParentFile().exists()) {
desc.getParentFile().mkdirs();
}
return downloadPath;
}
/**
* 编码文件名
*/
private static String encodingFilename(String filename) {
filename = UUID.randomUUID().toString() + "_" + filename + "." + ExcelTypeEnum.XLSX.getValue();
return filename;
}
/**
* Excel 类型枚举
*/
enum ExcelTypeEnum {
XLS("xls"), XLSX("xlsx");
private String value;
ExcelTypeEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
}
3带有图片的导出(小数据量)
3.1实体类
package com.per.easypoi.model;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.*;
import java.io.Serializable;
import java.lang.annotation.Target;
/**
* @author lz
* @date 2018/12/27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PersonExportVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 姓名
*/
@Excel(name = "姓名", orderNum = "0", width = 15)
private String name;
/**
* 性别
* 属性类型是Integer,因为从数据库中查出来是integer类型,虽然最后转化成“男”或者“女”
*/
@Excel(name = "性别", orderNum = "1", width = 15, replace = {"男_0", "女_1"})
private Integer sex;
/**
* 登录用户名
*/
@Excel(name = "用户名", orderNum = "2", width = 15)
private String username;
@Excel(name = "手机号码", orderNum = "3", width = 15)
private String phoneNumber;
/**
* 通过网络路径拿人脸图片
* 这个imageType必须为2,要不然报错
* 属性类型为byte数组
*/
@Excel(name = "人脸图片2", orderNum = "4", width = 15, height = 30, type = 2, imageType = 2)
private byte[] urlToPicture;
}
3.2文件网络URL转字节数组的Util
- 从实体类中可以看到图片urlToPicture属性是一个byte[]数组类型,一般情况下我们都会从数据库中查出来的图片形式为图片的网络URL地址,所以我提供一下网络URL转字节数组的Util
package com.per.easypoi.utils;
import org.springframework.stereotype.Component;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @Description: TODO 通过网络地址获取照片转化为字节数组
* @Author: lys
* @Date: 2020-09-12 14:11
* @Version: 1.3.*
*/
@Component
public class UrlFileToByte {
/**
* 根据文件链接把文件以流的形式下载下来
*
* @param urlPath
* @return
*/
public byte[] getImageFromURL(String urlPath) {
byte[] data = null;
InputStream is = null;
HttpURLConnection conn = null;
try {
URL url = new URL(urlPath);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("GET");
conn.setConnectTimeout(6000);
is = conn.getInputStream();
if (conn.getResponseCode() == 200) {
data = readInputStream(is);
} else {
data = null;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
conn.disconnect();
}
return data;
}
/**
* 把文件流转化为并且转成字节码
*
* @param is
* @return
*/
public byte[] readInputStream(InputStream is) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = -1;
try {
while ((length = is.read(buffer)) != -1) {
baos.write(buffer, 0, length);
}
baos.flush();
} catch (IOException e) {
e.printStackTrace();
}
byte[] data = baos.toByteArray();
try {
is.close();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
}
3.3 控制层controller代码
@Autowired
UrlFileToByte urlFileToByte;
/**
* 导出
*
* @param response
*/
@RequestMapping(value = "/export", method = RequestMethod.GET)
public void exportExcel(HttpServletResponse response) throws IOException {
List<PersonExportVo> personList = new ArrayList<>();
//用循环模拟数据库中的数据
for (int i = 0; i < 5; i++) {
PersonExportVo personVo = new PersonExportVo();
personVo.setName("张三" + i);
personVo.setUsername("张三" + i);
personVo.setPhoneNumber("18888888888");
personVo.setSex(0);
//通过工具类拿到网络路径的图片的byte数组
personVo.setUrlToPicture(urlFileToByte.getImageFromURL("http://mgjtest.4000750222.com/mgjtesteQuSJfRLnxJl.jpg"));
personList.add(personVo);
}
ExcelUtils.exportExcel(personList, "员工信息表", "员工信息", PersonExportVo.class, "员工信息", response);
}
4带有图片的导出(大数据量)
- 注意:数据量比较大的时候,尽量不要带有图片的导出,真的很耗时,真的很浪费资源,真的容易崩,推荐导出图片网络地址就好
- 大数据量导出的思路:就是分批查询数据加载到内存,然后写入Excal表格中。
4.1 实体类和3.1一样,文件网络URL转字节数组和3.2一样
4.2 分批读取数据载入内存,easypoi已经封装好了,我们只需实现IExcelExportServer类中selectListForExcelExport方法即可。
package com.mgj.hardware.client.api.component;
import cn.afterturn.easypoi.handler.inter.IExcelExportServer;
import com.mgj.face.machine.client.dto.SgPunchingCardRecordDTO;
import com.mgj.face.machine.client.service.client.ClientThirdPartyPlatformNewService;
import com.mgj.face.machine.client.vo.PunchingCardRecordExportVO;
import com.wheat.sunshine.common.util.BeanUtils;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @Description: TODO 导出
* @Author: lys
* @Date: 2020-09-18 15:31
* @Version: 1.3.*
*/
@Component
public class bigDataExport implements IExcelExportServer {
@Reference
ClientThirdPartyPlatformNewService platformNewService;
/**
*
* @param queryParams 查询数据库所需要的的条件,需要我们自己构造,在调用相关方法中传入。我会在controller中讲解
* @param page 这个我们不用管,由easypoi传入
* @return List<Object> 当为空或者null时,停着循环执行selectListForExcelExport此方法(通过查看源码你会懂得)
*/
@Override
public List<Object> selectListForExcelExport(Object queryParams, int page) {
SgPunchingCardRecordDTO dto = BeanUtils.copyProperties(queryParams, SgPunchingCardRecordDTO.class);
dto.setPage(page);
//一次读取3000条,写入表格
Integer flag = 3000;
dto.setSize(flag);
// Integer count = dto.getCount();
//Integer j = count % flag == 0 ? count / flag : count / flag + 1;
List<Object> list = new ArrayList<>();
List<PunchingCardRecordExportVO> vos = platformNewService.findAlls(dto);
list.addAll(vos);
return list;
}
}
4.3 在controller中的代码
@Autowired
BigDataExport bigDataExport;
/**
* 大数据量导出
* @param response
* @throws IOException
*/
@RequestMapping(value = "/exportBigExcel", method = RequestMethod.POST)
public void exportBigExcel(HttpServletResponse response,@RequestBody SgPunchingCardRecordDTO dto) throws IOException {
Long start = System.currentTimeMillis();
//调用自己封装的util
// dto 就是要传入easypoi内部的查询条件,然后最后用于我们实现的selectListForExcelExport方法中
ExcelUtils.exportBigExcel("test", "sheet", bigDataExport, PersonExportVo.class, response, Long.toBinaryString(System.currentTimeMillis()), true, dto);
Long end = System.currentTimeMillis();
System.out.println("共耗时"+(end-start)/1000.0+"s");
}
5带入图片的导入
5.1 实体类
package com.per.easypoi.model;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.*;
/**
* @Description: TODO
* @Author: lys
* @Date: 2020-09-12 16:17
* @Version: 1.3.*
*/
@Data
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PersonImportVo {
/**
* 姓名
*/
@Excel(name = "姓名(必填)", orderNum = "0", width = 15)
private String name;
/**
* 性别
* 属性类型是String,因为excel传上来是String类型,虽然最后转化成0或者1
*/
@Excel(name = "性别(必填)", orderNum = "1", width = 15, replace = {"男_0", "女_1"})
private String sex;
/**
* 登录用户名
*/
@Excel(name = "用户名", orderNum = "2", width = 15)
private String username;
@Excel(name = "手机号码", orderNum = "3", width = 15)
private String phoneNumber;
/**
* 通过本地拿人脸图片
* type 类型为2
* 属性类型为String,为本地存储该照片的路径
*/
@Excel(name = "人脸图片1", orderNum = "4", width = 15, height = 30, type = 2)
private String imageUrl;
}
5.2 导入数据的校验
-
注解校验:①此检验方式只能检验一些简单的数据符不符合规范,例如手机号,身份证什么的。
②这种注解检验方式使用在实体类的属性上,应用的是javax.validation,是不是很熟悉呀
③开启注解校验需要配置,具体怎么配置,往下看,和自定义检验一块讲
@NotBlank(message = "必填字段不能为空")//更多校验注解,可以了解一下javax.validation
@Excel(name = "姓名(必填)", orderNum = "0", width = 15)
private String name;
- 自定义校验
①应用于对我们自己项目中数据比较特殊的要求
②我们只需要实现IExcelVerifyHandler中的verifyHandler方法即可
③开启自定义校验当然也需要配置,也是一下面一块讲
package com.per.easypoi.utils;
import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
import com.per.easypoi.model.PersonExportVo;
import com.per.easypoi.model.PersonImportVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
/**
* @Description: TODO 自定义校验
* @Author: lys
* @Date: 2020-09-12 14:11
* @Version: 1.3.*
*/
@Component
public class TalentImportVerifyHandler implements IExcelVerifyHandler<PersonImportVo> {
/**
*
* @param inputEntity
* @return result.setSuccess(true); 通过校验。 result.setSuccess(false);跳过该条数据
*/
@Override
public ExcelVerifyHandlerResult verifyHandler(PersonImportVo inputEntity) {
ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult();
if (StringUtils.isNotBlank(inputEntity.getImageUrl())) {
//通过校验
result.setSuccess(true);
} else {
//未通过校验,忽略此行数据
result.setSuccess(false);
}
return result;
}
}
-
怎么开启数据校验
你是否在2.2.2导入导出util中看到如图一段代码,就是在那里开启的,但是我们是以参数的形式传过来是否开启,开启自定义效验还是注解校验,那么在哪里传入呢?当然是在方法被调用的时候传入,那方法什么时间被调用的,是在controller层,所以看5.3controller层代码展示。
5.3 controller层
@Autowired
TalentImportVerifyHandler talentImportVerifyHandler;
/**
* 导入
*自定义校验excel
* @param file
*/
@RequestMapping(value = "/import", method = RequestMethod.POST)
public void importExcel(@RequestParam("file") MultipartFile file) throws IOException {
//从调用传参可知:注解校验(false)没有被开启,自定义校验用的talentImportVerifyHandler
List<PersonImportVo> vos = ExcelUtils.importExcel(file,1,1,false, PersonImportVo.class,talentImportVerifyHandler);
for (PersonImportVo vo : vos) {
//做一些存库等其他操作
}
}
5.4 在带有图片Excel导入遇到的问题
-
其他字段都能拿到数据,图片字段拿不到数据,最后找到原因是插入图片的时候必须是浮动插入方式
-
完结
本文地址:https://blog.csdn.net/studyhard_/article/details/110078816