app开发定制公司【JAVA问题解决方案】01.EasyExcel导出数据超过Excel单表上限解决方案

app开发定制公司陈老老老板
说明:app开发定制公司新专栏专门记录一些在app开发定制公司工作中遇到的问题,app开发定制公司对于一些问题的思考,app开发定制公司同时进行解读。
app开发定制公司本文是介绍EasyExcelapp开发定制公司导出数据超过Excel单表上限解决方案

思考逻辑:
1.了解一下Excel单表最多存储多少行数据(可以存储1048576条数据,1024的平方,2的20次方)。
2.知道最多多少行就能以这个数为条件,如果超过则进行分表。
3.分表的同时需要对数据进行分割,才能不超过最大限度。
注: 这就是简单的demo,有关于自己项目中的逻辑自己加。
(非常简单,为了导出表更快)

@ToString@Data@NoArgsConstructor@AllArgsConstructorpublic class Student {   @ExcelProperty(value = "学生年龄")   private int age;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

测试类

//进行分表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
  • 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
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

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表中的列数默认-1,建议指定时从0开始
value对应Excel表中的列头
converter成员变量转换器自定义转换器需要实Converter接口

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

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

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

代码演示:

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

@ExcelIgnore

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

代码演示:

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

@DateTimeFormat

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

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

@NumberFormat

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

@ExcelIgnoreUnannotated

注:标注在类上。

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

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

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

结束语:裸体一旦成为艺术,便是最圣洁的。道德一旦沦为虚伪,便是最下流的。
勇敢去做你认为正确的事,不要被世俗的流言蜚语所困扰。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发