easypoi的简单实践实例

2022-07-27,,,

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导入遇到的问题

  • 其他字段都能拿到数据,图片字段拿不到数据,最后找到原因是插入图片的时候必须是浮动插入方式

  • github源码

  • 自我感觉没有这为大神写的好,推荐点击思考学习

  • 完结

本文地址:https://blog.csdn.net/studyhard_/article/details/110078816

《easypoi的简单实践实例.doc》

下载本文的Word格式文档,以方便收藏与打印。