⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/weixin_47343544/article/details/127398545 「陈老老老板」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

思考逻辑:

  1. 了解一下Excel单表最多存储多少行数据(可以存储1048576条数据,1024的平方,2的20次方)。
  2. 知道最多多少行就能以这个数为条件,如果超过则进行分表。
  3. 分表的同时需要对数据进行分割,才能不超过最大限度。

注: 这就是简单的demo,有关于自己项目中的逻辑自己加。

实体类(非常简单,为了导出表更快)

@ToString
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
@ExcelProperty(value = "学生年龄")
private int age;
}

测试类

//进行分表demo
@Test
public void TestWrite() {
//获取要导出的数据
List<Student> fillData = initFillData();
//获取一共多少条数据
int totalCount = fillData.size();
String fileName = "学生信息报告.xlsx";
//单表最多存储数
int sheetMaxNum = 1048576;

ExcelWriter excelWriter = null;
// 如果总数超出单个sheet的大小 1048575 则进行分页
if (totalCount > sheetMaxNum) {
excelWriter = EasyExcel.write(fileName, Student.class).build();
// 设置的单个Sheet的数据量,必须小于1048576,
int pageSize = 1048575;
//要分表的页数
int sheetCount = 0;
//如果能整除则为整除的数
if (totalCount % pageSize == 0){
sheetCount = totalCount / pageSize ;
}else{
//如果不能整除则+1
sheetCount = (totalCount / pageSize) + 1 ;
}
int num = 0;
//进行循环分表
for (int pageNum = 1; pageNum <= sheetCount; pageNum++) {
WriteSheet writeSheet = EasyExcel.writerSheet(pageNum, "学生信息Sheet表_" + pageNum).head(Student.class).build();

int fromIndex = pageSize * pageNum;
if (fromIndex >= totalCount) {
fromIndex = totalCount;
}
//将数据进行分组
excelWriter.write(fillData.subList(num, fromIndex), writeSheet);
num = fromIndex ;
}
} else { // 不超出则一次性全部导出
excelWriter = EasyExcel.write(fileName, Student.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("学生信息表").head(Student.class).build();
excelWriter.write(initFillData(), writeSheet);
}
excelWriter.finish();
}



测试导出两百万条数据
private static List<Student> initFillData() {
ArrayList<Student> fillDatas = new ArrayList<Student>();
for (int i = 2; i < 2000000; i++) {
Student fillData = new Student();
fillData.setAge(i);
fillDatas.add(fillData);
}
return fillDatas;
}

1、常用类

  • EasyExcel 入口类,用于构建开始各种操作;
  • ExcelReaderBuilder 构建出一个ReadWorkbook对象,即一个工作簿对象,对应的是一个Excel文件;
  • ExcelWriterBuilder 构建出一个WriteWorkbook对象,即一个工作簿对象,对应的是一个Excel文件;
  • ExcelReaderSheetBuilder 构建出一个ReadSheet对象,即一个工作表的对象,对应的Excel中的每个sheet,一个工作簿可以有多个工作表;
  • ExcelWriterSheetBuilder 构建出一WriteSheet对象,即一个工作表的对象,对应的Excel中的每个sheet,一个工作簿可以有多个工作表;
  • ReadListener 在每一行读取完毕后都会调用ReadListener来处理数据,我们可以把调用service的代码可以写在其invoke方法内部;
  • WriteHandler 在每一个操作包括创建单元格、创建表格等都会调用WriteHandler来处理数据,对使用者透明不可见;
  • 所有配置都是继承的 Workbook的配置会被Sheet继承。所以在用EasyExcel设置参数的时候,在EasyExcel…sheet()方法之前作用域是整个sheet,之后针对单个sheet。

2、读取时的注解

@ExcelProperty

使用位置:标准作用在成员变量上

可选属性:

注:index属性可以指定当前字段对应excel中的哪一列,可以根据列名value去匹配,也可以不写。

如果不使用@ExcelProperty注解,成员变量从上到下的顺序,对应表格中从左到右的顺序;

要么全部不写,要么全部用index,要么全部用名字去匹配,尽量不要三个混着用。

代码演示:

// 1. 修改成员变量顺序读取Excel表格
// 2. 修改index属性值读取Excel表格
// 3. 修改value属性值读取Excel表格
@ExcelProperty(value = "学生姓名",index = 3)
private String name;

@ExcelIgnore

标注在成员变量上,默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

代码演示:

// 4. 忽略id成员变量值读取Excel表格,在excel中不会显示。
@Excellgore
private String id;

@DateTimeFormat

标注在成员变量上,日期转换,代码中用String类型的成员变量去接收excel中日期格式的数据会调用这个注解。里面的value参照java.text.SimpleDateFormat

// 5. 按照指定的格式写入Excel内容
//只显示年月日
@DateTimeFormat("YYYY-MM-dd")
private Date birthday;

@NumberFormat

标注在成员变量上,数字转换,代码中用String类型的成员变量去接收excel数字格式的数据会调用这个注解。里面的value参照java.text.DecimalFormat

@ExcelIgnoreUnannotated

注:标注在类上。

不标注该注解时,默认类中所有成员变量都会参与读写,无论是否在成员变量上加了@ExcelProperty的注解。

标注该注解后,类中的成员变量如果没有标注@ExcelProperty 注解将不会参与读写。

总结

这是简单的demo,没有关于项目逻辑的,有关项目的自己加就ok了。希望对您有帮助,感谢阅读

文章目录
  1. 1. 1、常用类
  2. 2. 2、读取时的注解
    1. 2.1. @ExcelProperty
    2. 2.2. @ExcelIgnore
    3. 2.3. @DateTimeFormat
    4. 2.4. @NumberFormat
    5. 2.5. @ExcelIgnoreUnannotated
  3. 3. 总结