欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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常用注解

属性 类型 类型 说明
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层代码展示。
    easypoi的简单实践实例

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