Esayexcel简介及写、读操作

  • 1、Excel导入导出的应用场景
  • 2、Esayexcel简介
  • 3、Esayexcel特点
  • 4、实现EasyExcel对Excel写操作
    • 4.1、创建一个普通的maven项目
    • 4.2、在pom.xml中引入依赖
    • 4.3、创建实体类,和excel数据对应
    • 4.4、实现excel写操作
    • 4.5、测试。运行 4.4中TestEasyExcel类
  • 5、实现EasyExcel对Excel读操作
    • 5.1、创建一个普通的maven项目
    • 5.2、在pom.xml中引入依赖
    • 5.3、创建实体类,和excel数据对应
    • 5.4、创建监听器进行excel文件读取
    • 5.5、编写测试方法
    • 5.6、测试过程中可能出现的异常:
      • 5.6.1、异常
      • 5.6.2、异常原因:
      • 5.6.3、修改前:
      • 5.6.4、修改后:
    • 5.7、控制台输出结果

1、Excel导入导出的应用场景

  • 数据导入:减轻录入工作量
  • 数据导出:统计信息归档
  • 数据传输:异构系统之间数据传输

2、Esayexcel简介

Esayexcel使Java解析excel的工具。

Esayexcel在GitHub地址:https://github.com/alibaba/easyexcel

3、Esayexcel特点

  • Java领域解析、生成Excel比较有名的框架有Apache
    poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full
    gc。
  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

4、实现EasyExcel对Excel写操作

即将数据写到excel文件中

4.1、创建一个普通的maven项目

项目名:excel-easydemo

4.2、在pom.xml中引入依赖

 <dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency><!--实现easyexcel操作--><!--xls--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>${poi.version}</version></dependency><!--xlsx--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency></dependencies>

4.3、创建实体类,和excel数据对应

import lombok.Data;/*** @Description :* @Author :lenovo* @Date :2021/3/7 20:31*/
@Data
public class DemoData {/*   @ExcelProperty(value = String[], index = int):设置表头信息value: 表名称index: 列号*/@ExcelProperty("学生编号")private Integer sno;@ExcelProperty("学生姓名")private String sname;
}

@ExcelProperty注解

4.4、实现excel写操作

package com.nonglin.demo.excel;import com.alibaba.excel.EasyExcel;import java.util.ArrayList;
import java.util.List;/*** @Description :* @Author :lenovo* @Date :2021/3/7 20:44*/
public class TestEasyExcel {public static void main(String[] args) {//实现excel写的操作写法1//1、设置夏尔u文件夹地址和excel文件名称String filename = "E://write.xlsx";//2、调用easyexcel里面的方法实现写操作//write方法两个参数:第一个参数文件路径名称,第二个参数实体类class//sheet中的sheetName参数是设置生成的excel文件中工作表的名字// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭EasyExcel.write(filename,DemoData.class).sheet("学生列表").doWrite(getList());//        // 写法2,方法二需要手动关闭流
//        String fileName = "E://write.xlsx";
//        // 这里 需要指定写用哪个class去写
//        ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
//        WriteSheet writeSheet = EasyExcel.writerSheet("写入方法二").build();
//        excelWriter.write(getList(), writeSheet);
//        /// 千万别忘记finish 会帮忙关闭流
//        excelWriter.finish();//将写入的数据放到list集合中public static List<DemoData> getList(){List<DemoData> list = new ArrayList<>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setSno(i);data.setSname("Lucy"+i);list.add(data);}return list;}}

4.5、测试。运行 4.4中TestEasyExcel类

在E盘根目录下生成了write.xlsx文件

5、实现EasyExcel对Excel读操作

5.1、创建一个普通的maven项目

项目名:excel-easydemo

5.2、在pom.xml中引入依赖

 <dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency><!--实现easyexcel操作--><!--xls--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>${poi.version}</version></dependency><!--xlsx--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency></dependencies>

5.3、创建实体类,和excel数据对应

package com.nonglin.demo.excel;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;/*** @Description :* @Author :lenovo* @Date :2021/3/7 20:31*/
@Data
@ToString
public class DemoData {/*   @ExcelProperty(value = String[], index = int):设置表头信息value: 表名称index: 列号*/@ExcelProperty(value = "学生编号",index = 0)private Integer sno;@ExcelProperty(value = "学生姓名",index = 1)private String sname;
}

5.4、创建监听器进行excel文件读取

package com.nonglin.demo.excel;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.sql.SQLOutput;
import java.util.Map;/*** @Description :* @Author :lenovo* @Date :2021/3/7 21:24*/
//创建读取excel监听器
public class ExcelListener extends AnalysisEventListener<DemoData> {//一行一行读取excel内容@Overridepublic void invoke(DemoData data, AnalysisContext analysisContext) {System.out.println("****"+data);}//读取表头内容@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头:"+headMap);}//读取完成之后@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}

5.5、编写测试方法

package com.nonglin.demo.excel;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.write.metadata.WriteSheet;
import org.junit.Test;import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;/*** @Description :* @Author :lenovo* @Date :2021/3/7 20:44*/
public class TestEasyExcel {@Test//实现excel读操作public void read() throws FileNotFoundException {//写法1String fileName  = "E://write.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭EasyExcel.read(fileName,DemoData.class,new ExcelListener()).sheet().doRead();//        // 写法2,方法二需要手动关闭流
//        InputStream in = new BufferedInputStream(new FileInputStream("E://write.xlsx"));
//        ExcelReader excelReader = EasyExcel.read(in, DemoData.class, new ExcelListener()).build();
//        ReadSheet readSheet = EasyExcel.readSheet(0).build();
//        excelReader.read(readSheet);
//        // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
//        excelReader.finish();}}

5.6、测试过程中可能出现的异常:

5.6.1、异常

com.alibaba.excel.exception.ExcelCommonException: The index of 'sno' and 'sname' must be inconsistentat com.alibaba.excel.util.ClassUtils.declaredFields(ClassUtils.java:109)at com.alibaba.excel.util.ClassUtils.getFieldCache(ClassUtils.java:59)at com.alibaba.excel.util.ClassUtils.declaredFields(ClassUtils.java:31)at com.alibaba.excel.metadata.property.ExcelHeadProperty.initColumnProperties(ExcelHeadProperty.java:126)at com.alibaba.excel.metadata.property.ExcelHeadProperty.<init>(ExcelHeadProperty.java:91)at com.alibaba.excel.read.metadata.property.ExcelReadHeadProperty.<init>(ExcelReadHeadProperty.java:16)at com.alibaba.excel.read.metadata.holder.AbstractReadHolder.<init>(AbstractReadHolder.java:73)at com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder.<init>(ReadWorkbookHolder.java:121)at com.alibaba.excel.context.AnalysisContextImpl.<init>(AnalysisContextImpl.java:45)at com.alibaba.excel.analysis.ExcelAnalyserImpl.<init>(ExcelAnalyserImpl.java:44)at com.alibaba.excel.ExcelReader.<init>(ExcelReader.java:143)at com.alibaba.excel.read.builder.ExcelReaderBuilder.build(ExcelReaderBuilder.java:237)at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:260)at com.alibaba.excel.read.builder.ExcelReaderBuilder.sheet(ExcelReaderBuilder.java:248)at com.nonglin.demo.excel.TestEasyExcel.read(TestEasyExcel.java:52)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

5.6.2、异常原因:

原因是两个字段的index索引值都是没按顺序来,导致异常,索引index从0开始递增

5.6.3、修改前:

5.6.4、修改后:

5.7、控制台输出结果

Day06-Esayexcel简介及写、读操作-p95、96相关推荐

  1. 片上总线Wishbone 学习(十)总线周期之单写读操作

    转自http://blog.csdn.net/ce123_zhouwei/article/details/6933926 片上总线Wishbone 学习(十)总线周期之单写读操作 异步周期结束方式 单 ...

  2. MYSQL存储过程进行写读操作(for循环)

    在我们做统计的时候,尤其是复杂的数据统计,写sql是非常麻烦且痛苦的一件事情.尤其是表结构设计的不适合做统计的时候,更是难以下手.当做 统计的时候:需要牵扯到多张表且每个统计信息需要关联N张表才能出来 ...

  3. python中文件读写位置的作用-Python中文件的读写、写读和追加写读三种模式的特点...

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  4. Python中文件的读写、写读和追加写读三种模式的特点

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  5. python语言特点强制可读-Python中文件的读写、写读和追加写读三种模式的特点

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  6. java jxl 写 excel_Java 操作Excel(jxl读和写)

    一.读操作: package com.jxl.opr; import java.io.FileInputStream; import java.io.FileNotFoundException; im ...

  7. 对已有文件进行既读又写的操作时关于文件位置注意事项(适用于Python和C/C++)

    当我们需要对现有文件进行读取数据并修改文件中的数据时,就需要用到对已有文件进行既读又写的操作.有多种可读且可写的文件打开方式:r+,w+,a+,rb+,wb+,ab+,具体含义见下表. 打开 方式 读 ...

  8. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (14) - 读存操作写存操作

    Load and Store Operation Overview 本节讲述读存与写存操作. Loads 当指令从回写式类型的存储器中的某个地址读取数据时,处理器会从高速缓存和存储器中查找数据.下表描 ...

  9. mysql+影响的行数+获取_CI中获取读操作的结果集行数+获取写操作的影响行数

    本质:读操作,用mysql_num_rows函数,写操作用mysql_affected_rows函数 mysql_num_rows() 返回结果集中行的数目.此命令仅对 SELECT 语句有效.要取得 ...

最新文章

  1. ② DataGridView 设定单元格只读
  2. Spring 面试问题 TOP 50,你会哪些?
  3. 面向对象设计原则之一:单一职责原则
  4. MT7628/MT7688 修改串口2作为调试串口 所踩的坑
  5. 如何开发Teams Bot
  6. 洛谷 P3835: 【模板】可持久化平衡树
  7. db2locate函数_DB2常用函数详解
  8. 飞思卡尔与PowerPC介绍
  9. LintCode-7-二叉树的序列化和反序列化
  10. C#图片处理之:色彩调整
  11. Hystrix入门与分析(一):初识Hystrix
  12. JAVA练习题1(初级基本数据类型、运算符)
  13. 哈夫曼树(二)之 C++详解
  14. 思科为计算机配置ip命令,使用CLI在交换机上配置IP地址设置
  15. bypass功能介绍
  16. Spring boot2.0 JpaRepository findOne的使用
  17. RS-485总线布线规则及方法
  18. manjaro xfce 环境配置
  19. 程序员的一天:一寸光阴一寸金
  20. C语言——求三个数中最大值(6种方法)

热门文章

  1. 卸载“趋势科技防毒墙网络版客户机”方法之一
  2. NHANES数据库的介绍及使用(一)
  3. 计算机试题及答案大学网络创业交流会,解析:在考生文件夹下打开文档WORD.DOCX。某高校学生会计划举办一场“大学生网络创业交流会”的活动,拟邀 - 计算机二级 - 看书网站...
  4. 数据库第一范式(图解)
  5. 【安全测试学习】基于bWAPP靶场,使用sqlmap实现脱库实战
  6. signature=bb62aa304c060f1aa02747ce12745e99,潘通色卡颜色代码及参考色对照表
  7. java 设计模式.pdf 免费下载
  8. 2021.12.20(第二周) 实习周记lzhuan
  9. TTL与CMOS使用区别
  10. Adobe Acrobat 安装 E1935 0x80070BC9 错误 经验