当前位置:   article > 正文

EasyExcel的简单使用(easyExcel和poi)_easyexcel3.1.1和poi

easyexcel3.1.1和poi

EasyExcel的简单使用

前言
Excel读
1.实体类
2.读监听器与测试类
3.输出结果
Excel写
1.实体类
2.写入Excel的测试类
3.输出结果
填充Excel
1.Excel模板
2.测试类
3.输出结果
前言
EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,即能让使用者在不用考虑性能、内存的等因素的情况下,快速完成Excel的读(导入)、写(导出)等功能。

版本支持:
2+版本支持Java7&Java6
3+版本支持Java8

这里使用的EasyExcel版本为3.1.1,JDK版本为1.8.0_161,同时辅助使用lombok和fastjson以简化代码或转化为Jason数据。
Maven依赖配置:

<dependencies>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>easyexcel</artifactId>
		<version>3.1.1</version>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>		//非必要
		<version>1.16.10</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>	//非必要
		<version>1.2.47</version>
	</dependency>
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Excel读
样例内容:
在这里插入图片描述
1.实体类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TextReadObject {

    @ExcelProperty(index = 0)
    private Integer studentId;

    @ExcelProperty(index = 1)
    private String studentName;

    @ExcelProperty(index = 2)
    private String institute;

    @ExcelProperty(index = 3)
    private Integer level_11;

    @ExcelProperty(index = 4)
    private Integer level_12;

    @ExcelProperty(index = 5)
    private Integer level_21;

    @ExcelProperty(index = 6)
    private Integer level_22;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

其中注解@ExcelProperty可包含两个参数index和value,在简单表头(即表头只占用一行)中以下两条注解基本等价

@ExcelProperty(index = 0)
  • 1
@ExcelProperty(value = “学号”)
  • 1

而在复杂表头(即本例)中,需要使用index表示。
另外需要注意的是加入表头名字出现重复,会导致只有一个字段读取到数据,此外在读取操作时不建议index和value同时使用。综上所述,在已知excel表头内容的情况下使用参数index。

2.读监听器与测试类
四个监听器,这里使用前两个
在这里插入图片描述
AnalysisEventListener < T >
所有已实现的接口:Listener、ReadListener
直接已知子类:SyncReadListener
在这里插入图片描述

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Map;
import java.util.List;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class DemoDataListener extends AnalysisEventListener<TextReadObject> {
    private List<TextReadObject> dataList;
    //读取表头的内容
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头->"+headMap);
    }
    //一行一行读取excel中的内容
    @Override
    public void invoke(TextReadObject data, AnalysisContext context) {
        dataList.add(data);
    }
    //读取完成之后执行的方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

读取Excel的测试类:

import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;

public class ExcelImport {
	public static void simpleRead() {
        String fileName = "F:\\rdtext.xls";
        List<TextReadObject> dataList = new ArrayList<>();
        //每次会读取100条数据然后返回过来,直接调用使用数据就行
        EasyExcel.read(fileName, TextReadObject.class, new DemoDataListener(dataList))
                .sheet(0)//读取第一个sheet
                .headRowNumber(3) //跳过前三行表头内容,假如是简单表头则这句可省略
                .doRead();
        //若需要实现读取全部sheet,可以使用.doReadAll()代替.sheet(0).doRead()

        for (TextReadObject dl : dataList) {
            System.out.println(JSON.toJSONString(dl));
        }
	}
	public static void main(String[] args) { simpleRead(); }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

SyncReadListener:
所有已实现的接口:Listener、ReadListener
直接已知父类:AnalysisEventListener < T >

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.SyncReadListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class ExcelImportSync {
    public static void simpleRead() {
        String fileName = "F:\\text.xls";
        final List dataList = new ArrayList();
        EasyExcel.read(fileName, TextReadObject.class, new SyncReadListener() {
            @Override
            public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
                System.out.println("表头->"+headMap);
            }
            @Override
            public void invoke(Object object, AnalysisContext context) {
                dataList.add(object);
            }
        }).sheet(0).headRowNumber(3).doRead();
        for (Object o : dataList) {
            TextReadObject TOB = (TextReadObject) o;
            System.out.println(JSON.toJSONString(TOB));
        }
    }
    public static void main(String[] args) { simpleRead(); }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

相较于AnalysisEventListener < T >,SyncReadListener更加适合对多种实体类实施相同操作的情况,在定义监听器时没有指定具体的实体类。

3.输出结果
二者输出结果一样:
在这里插入图片描述
Excel写
1.实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ColumnWidth(15) //列宽,最大值为255
@HeadRowHeight(16) //表头行高
@ContentRowHeight(16) //数据行高
public class TextWriteObject {
    //复杂表头自动合并相同的内容
    @ExcelProperty(index = 0, value = {"学号", "学号", "学号"})
    private Integer studentId;

    @ExcelProperty(index = 1, value = {"姓名", "姓名", "姓名"})
    private String studentName;

    @ColumnWidth(25)//单独设置列宽
    @ExcelProperty(index = 2, value = {"学院", "学院", "学院"})
    private String institute;
    //复杂表头嵌套
    @ExcelProperty(index = 3, value = {"成绩", "第一学年", "第一学期"})
    private Integer level_11;

    @ExcelProperty(index = 4, value = {"成绩", "第一学年", "第二学期"})
    private Integer level_12;

    @ExcelProperty(index = 5, value = {"成绩", "第二学年", "第一学期"})
    private Integer level_21;

    @ExcelProperty(index = 6, value = {"成绩", "第二学年", "第二学期"})
    private Integer level_22;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

此时在注解@ExcelProperty中可以同时使用参数index和value,用于同时指定位置和内容。

其他未使用注解:
@ContentStyle用于设置内容格式
在这里插入图片描述
在这里插入图片描述
@ContentFontStyle用于设置单元格内容字体格式
在这里插入图片描述
在这里插入图片描述
@ExcelIgnore不将该字段转换成Excel

@ExcelIgnoreUnannotated没有注解的字段都不转换

2.写入Excel的测试类

import java.util.ArrayList;
import java.util.List;

public class ExcelExport {
    public static void simpleWrite(){
        String fileName = "F:\\wttext.xls";
        List<TextWriteObject> dataList = new ArrayList<>();
        dataList.add(new TextWriteObject(2022101, "张三",
                "生命科学院", 653, 602, 683, 707));
        dataList.add(new TextWriteObject(2022102, "李四",
                "生命科学院", 568, 596, 611, 632));
        dataList.add(new TextWriteObject(2022103, "王五",
                "生命科学院", 606, 673, 624, 653));
        dataList.add(new TextWriteObject(2022201, "赵六",
                "语言文学院", 710, 722, 686, 703));
        EasyExcel.write(fileName, TextWriteObject.class)
                .sheet(0)
                .doWrite(dataList);
    }
    public static void main(String[] args) { simpleWrite(); }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3.输出结果
在这里插入图片描述
原文链接:https://blog.csdn.net/hermit_f/article/details/126850664
https://blog.csdn.net/hermit_f/article/details/126850664?spm=1001.2014.3001.5506

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/170240
推荐阅读
相关标签
  

闽ICP备14008679号