全网最全最简单使用easypoi导入导出Excel的操作手册(二)

简介: 今天做Excel导出时,发现了一款非常好用的POI框架EasyPoi,其 使用起来简洁明了。现在我们就来介绍下EasyPoi,首先感谢EasyPoi 的开发者 Lemur开源

注解方式导入Excel

基于注解的导入导出,配置配置上是一样的,只是方式反过来而已。首先让我们来看看 ImportParams类,这个类主要是设置导入参数,例如表格行数,表头行数等等。

ImportParams参数介绍

需要说明的是
1、titleRows表示的是表格标题行数,如果没有就是0,如果有一个标题就是1,如果是两个标题就2

2. headRows表示的是表头行数,默认是1,如果有两个表头则需要设置2。

导入情形一:有标题有表头

我们有如下格式的Excel需要导入:

这个Excel有一个标题行,有一个表头行,所以我们有了如下设置:

ImportParams params = new ImportParams();
  //设置标题的行数,有标题时一定要有
        params.setTitleRows(1);
  //设置表头的行数
        params.setHeadRows(1);

导入的demo

@Test
    public void haveTitleTest() {
        ImportParams params = new ImportParams();
  //设置标题的行数,有标题时一定要有
        params.setTitleRows(1);
  //设置表头的行数
        params.setHeadRows(1);
        String file = Thread.currentThread().getContextClassLoader().getResource("haveTitle.xlsx").getFile();
        List<ScoreIssueReqPOJO> list = ExcelImportUtil.importExcel(
                new File(file),
                ScoreIssueReqPOJO.class, params);
        System.out.println("解析到的数据长度是:" + list.size());
        for (ScoreIssueReqPOJO scoreIssueReqPOJO : list) {
                       System.out.println("***********有标题有表头导入的数据是=" + scoreIssueReqPOJO.toString());
        }
    }

导入测试的结果是:

3acb703f2afe9652ce2bf7f07a3fa420_20200319135225371.png

导入情形二:有表头没有标题

e86483c20b5b3f5f227d20ea2a9446bc_20200319135001890.png

只有一个表头没有标题的话,我们ImportParams可以用默认的值。

导入的demo

@Test
    public void notTitleTest() {
        ImportParams params = new ImportParams();
        String file = Thread.currentThread().getContextClassLoader().getResource("notTitle.xlsx").getFile();
        List<ScoreIssueReqPOJO> list = ExcelImportUtil.importExcel(
                new File(file),
                ScoreIssueReqPOJO.class, params);
        System.out.println("解析到的数据长度是:" + list.size());
        for (ScoreIssueReqPOJO scoreIssueReqPOJO : list) {
           System.out.println("***********有表头没有标题导入的数据是=" + scoreIssueReqPOJO.toString());
        }
    }

导入结果如下:

c2349fd68ea9f77a42ad95b72355db67_20200319135341203.png

导入实体Bean配置

public class ScoreIssueReqPOJO implements java.io.Serializable{
    /**
     * 用户手机号
     */
    @Excel(name = "个人用户手机号*",width = 14)
    private String mobile;
    /**
     * 企业用户税号
     */
    @Excel(name = "企业用户税号*",width = 20)
    private String taxNum;
    /**
     * 公司名称或者用户名
     */
    @Excel(name = "名称",width = 20)
    @Length(max =50 ,message = "名称过长")
    private String realname;
    /**
     * 积分数量
     * isStatistics 自动统计数据
     */
    @Excel(name = "积分数量*")
    @NotNull(message = "积分数量不能为空")
    private String scoreNum;
    /**
     * 平台类型
     */
    @Excel(name = "业务代码")
    @Length(max =2 ,message = "业务代码过长,最长2个字符(必须由诺诺网分配,请勿乱填)")
    private String platform;
    /**
     * 备注
     */
    @Excel(name = "备注")
    @Length(max =120 ,message = "备注过长,最长120个字符")
    private String typeContent;
}

Excel导入校验

EasyPoi的校验使用也很简单,在导入对象上加上通用的校验规则或者这定义的这个看你用的哪个实现

然后params.setNeedVerfiy(true);配置下需要校验就可以了

看下具体的代码

/**
     * Email校验
     */
    @Excel(name = "Email", width = 25)
    private String email;
    /**
     * 最大
     */
    @Excel(name = "Max")
    @Max(value = 15,message = "max 最大值不能超过15" ,groups = {ViliGroupOne.class})
    private int    max;
    /**
     * 最小
     */
    @Excel(name = "Min")
    @Min(value = 3, groups = {ViliGroupTwo.class})
    private int    min;
    /**
     * 非空校验
     */
    @Excel(name = "NotNull")
    @NotNull
    private String notNull;
    /**
     * 正则校验
     */
    @Excel(name = "Regex")
    @Pattern(regexp = "[\u4E00-\u9FA5]*", message = "不是中文")
    private String regex;

使用方式就是在导入时设置needVerfiy属性为true。导入的demo如下所示:


@Test
    public void basetest() {
        try {
            ImportParams params = new ImportParams();
            params.setNeedVerfiy(true);
            params.setVerfiyGroup(new Class[]{ViliGroupOne.class});
            ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelMore(
                new File(PoiPublicUtil.getWebRootPath("import/verfiy.xlsx")),
                ExcelVerifyEntity.class, params);
            FileOutputStream fos = new FileOutputStream("D:/excel/ExcelVerifyTest.basetest.xlsx");
            result.getWorkbook().write(fos);
            fos.close();
            for (int i = 0; i < result.getList().size(); i++) {
                System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i)));
            }
            Assert.assertTrue(result.getList().size() == 1);
            Assert.assertTrue(result.isVerfiyFail());
        } catch (Exception e) {
            LOGGER.error(e.getMessage(),e);

导入结果ExcelImportResult

导入之后返回一个ExcelImportResult 对象,比我们平时返回的list多了一些元素

/**
     * 结果集
     */
    private List<T>  list;
    /**
     * 是否存在校验失败
     */
    private boolean  verfiyFail;
    /**
     * 数据源
     */
    private Workbook workbook;

一个是集合,是一个是是否有校验失败的数据,一个原本的文档,但是在文档后面追加了错误信息

注意,这里的list,有两种返回

一种是只返回正确的数据

一种是返回全部的数据,但是要求这个对象必须实现IExcelModel接口,如下

IExcelModel

public class ExcelVerifyEntityOfMode extends ExcelVerifyEntity implements IExcelModel {
    private String errorMsg;
    @Override
    public String getErrorMsg() {
        return errorMsg;
    }
    @Override
    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
}

IExcelDataModel

获取错误数据的行号

public interface IExcelDataModel {
    /**
     * 获取行号
     * @return
     */
    public int getRowNum();
    /**
     *  设置行号
     * @param rowNum
     */
    public void setRowNum(int rowNum);
}

需要对象实现这个接口

每行的错误数据也会填到这个错误信息中,方便用户后面自定义处理

看下代码

@Test
    public void baseModetest() {
        try {
            ImportParams params = new ImportParams();
            params.setNeedVerfiy(true);
            ExcelImportResult<ExcelVerifyEntityOfMode> result = ExcelImportUtil.importExcelMore(
                    new FileInputStream(new File(PoiPublicUtil.getWebRootPath("import/verfiy.xlsx"))),
                ExcelVerifyEntityOfMode.class, params);
            FileOutputStream fos = new FileOutputStream("D:/excel/baseModetest.xlsx");
            result.getWorkbook().write(fos);
            fos.close();
            for (int i = 0; i < result.getList().size(); i++) {
                System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i)));
            }
            Assert.assertTrue(result.getList().size() == 4);
        } catch (Exception e) {
            LOGGER.error(e.getMessage(),e);
        }
    }

定制化修改

有时候,我们需要定制化一些信息,比如,导出Excel时,我们需要统一Excel的字体的大小,字型等。我们可以通过实现IExcelExportStyler接口或者继承ExcelExportStylerDefaultImpl类来实现。如下所示:我们定义了一个ExcelStyleUtil工具类继承了ExcelExportStylerDefaultImpl(样式的默认实现类),并且将列头,标题,单元格的字体都设置为了宋体。

public class ExcelStyleUtil extends ExcelExportStylerDefaultImpl {
    public ExcelStyleUtil(Workbook workbook) {
        super(workbook);
    }
  /**
     * 标题样式
     */ 
    @Override
    public CellStyle getTitleStyle(short color) {
        CellStyle cellStyle = super.getTitleStyle(color);
        cellStyle.setFont(getFont(workbook, 11, false));
        return cellStyle;
    }
  /**
     * 单元格的样式
     */
    @Override
    public CellStyle stringSeptailStyle(Workbook workbook, boolean isWarp) {
        CellStyle cellStyle = super.stringSeptailStyle(workbook, isWarp);
        cellStyle.setFont(getFont(workbook, 11, false));
        return cellStyle;
    }
  /**
     * 列表头样式
     */
    @Override
    public CellStyle getHeaderStyle(short color) {
        CellStyle cellStyle =  super.getHeaderStyle(color);
        cellStyle.setFont(getFont(workbook, 11, false));
        return cellStyle;
    }
  /**
     * 单元格的样式
     */
    @Override
    public CellStyle stringNoneStyle(Workbook workbook, boolean isWarp) {
        CellStyle cellStyle = super.stringNoneStyle(workbook, isWarp);
        cellStyle.setFont(getFont(workbook, 11, false));
        return cellStyle;
    }
    /**
     * 字体样式
     *
     * @param size   字体大小
     * @param isBold 是否加粗
     * @return
     */
    private Font getFont(Workbook workbook, int size, boolean isBold) {
        Font font = workbook.createFont();
        //字体样式
        font.setFontName("宋体");
        //是否加粗
        font.setBold(isBold);
        //字体大小
        font.setFontHeightInPoints((short) size);
        return font;
    }
}

然后就是对ExcelExportUtil类进行包装,如下所示:

public class OfficeExportUtil {
    /**
     *
     */
    private static final Integer EXPORT_EXCEL_MAX_NUM = 20000;
    /**
     * 获取导出的Workbook对象
     *
     * @param sheetName 页签名
     * @param clazz     类对象
     * @param list      导出的数据集合
     * @return
     * @author xiagwei
     * @date 2020/2/10 4:45 PM
     */
    public static Workbook getWorkbook(String sheetName, Class clazz, List<?> list) {
        //判断数据是否为空
        if (CollectionUtils.isEmpty(list)) {
            log.info("***********导出数据行数为空!");
            list = new ArrayList<>();
        }
        if (list.size() > EXPORT_EXCEL_MAX_NUM) {
            log.info("***********导出数据行数超过:" + EXPORT_EXCEL_MAX_NUM + "条,无法导出、请添加导出条件!");
            list = new ArrayList<>();
        }
        log.info("***********"+sheetName+"的导出数据行数为"+list.size()+"");
        //获取导出参数
        ExportParams exportParams = new ExportParams();
        //设置导出样式
        exportParams.setStyle(ExcelStyleUtil.class);
        //设置sheetName
        exportParams.setSheetName(sheetName);
        //输出workbook流
        return ExcelExportUtil.exportExcel(exportParams, clazz, list);
    }

使用的话,我们只需要获取需要导出的数据,然后调用OfficeExportUtil的getWorkbook方法。

总结

本文主要介绍了EasyPOI的使用和相关属性,EasyPOI使用起来还是蛮简单的。但是有个缺点是导入导出大批量数据时性能没那么好。

参考代码

https://gitee.com/lemur/easypoi-test

参考

EasyPoi教程

相关文章
|
6月前
|
Java 数据库 数据安全/隐私保护
Java操作Excel文件导入导出【内含有 jxl.jar 】
Java操作Excel文件导入导出【内含有 jxl.jar 】
94 0
|
5月前
|
机器学习/深度学习 存储 数据可视化
这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来
微软在 UserVoice 上运营着⼀个反馈论坛,每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将 Python 作为Excel 的⼀门脚本语⾔”,其得票数差不多是第⼆名的两倍。尽管⾃2015 年这个点⼦发布以来并没有什么实质性进展,但在 2020 年年末,Python 之⽗ Guido van Rossum 发布推⽂称“退休太无聊了”,他将会加入微软。此事令 Excel ⽤户重燃希望。我不知道他的举动是否影响了 Excel 和 Python 的集成,但我清楚的是,为何⼈们迫切需要结合 Excel 和 Python 的⼒量,⽽你⼜应当如何从今天开始将两者结合起来。总之,这就是本
|
5月前
|
机器学习/深度学习 存储 数据可视化
这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来
微软在 UserVoice 上运营着⼀个反馈论坛,每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将 Python 作为Excel 的⼀门脚本语⾔”,其得票数差不多是第⼆名的两倍。尽管⾃2015 年这个点⼦发布以来并没有什么实质性进展,但在 2020 年年末,Python 之⽗ Guido van Rossum 发布推⽂称“退休太无聊了”,他将会加入微软。此事令 Excel ⽤户重燃希望。我不知道他的举动是否影响了 Excel 和 Python 的集成,但我清楚的是,为何⼈们迫切需要结合 Excel 和 Python 的⼒量,⽽你⼜应当如何从今天开始将两者结合起来。总之,这就是本
|
4月前
|
开发框架 算法 .NET
C#使用MiniExcel导入导出数据到Excel/CSV文件
C#使用MiniExcel导入导出数据到Excel/CSV文件
110 0
|
6月前
|
Java easyexcel
java开发excel导入导出工具类基于EasyExcel
java开发excel导入导出工具类基于EasyExcel
331 1
|
6月前
|
Java API Spring
集成EasyPoi(一个基于POI的Excel导入导出工具)到Spring Boot项目中
集成EasyPoi(一个基于POI的Excel导入导出工具)到Spring Boot项目中
581 1
|
6月前
|
前端开发 Java 开发工具
如何在Spring Boot框架下实现高效的Excel服务端导入导出?
ArtifactId:是项目的唯一标识符,在实际开发中一般对应项目的名称,就是项目根目录的名称。 Group Id,Artfact Id是保证项目唯一性的标识,一般来说如果项目打包上传至maven这样的包管理仓库中。在搜索你的项目时,Group Id,Artfact Id是必要的条件。 Version:版本号,默认0.0.1-SNAPSHOT。SNAPSHOT代表不稳定的版本,与之相对的有RELEASE。 Project type:工程的类型,maven工程还是gradle工程。 Language:语言(Java,Kotlin,Groovy)。
|
6月前
|
easyexcel Java API
Apache POI与easyExcel:Excel文件导入导出的技术深度分析
Apache POI与easyExcel:Excel文件导入导出的技术深度分析
|
23天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
160 4