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

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

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

测试类

//进行分表demo@Testpublic 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{//如果不能整除则+1sheetCount = (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表中的列数 默认-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;

@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了。希望对您有帮助,感谢阅读

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

【JAVA问题解决方案】01.EasyExcel导出数据超过Excel单表上限解决方案相关推荐

  1. EasyExcel 导出数据超过 Excel 单表上限了,该怎么办???

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  2. EasyExcel导出数据超过Excel单表上限时进行分表

    解决的问题 Excel单表最多可以存储1048576条数据 如果超过这个多条数据则进行Excel分表. 分表的同时需要对数据进行分割,来保证不超过Excel最大存储条数. 实体类(测试用,非常简单) ...

  3. EasyExcel导出数据到Excel,浏览器提供下载

    最近的一个项目需求,需要为用户提供一个导出数据功能,点击批量下载按钮,将所选中的数据导入到Excel文档中供用户下载.如下图 点击批量下载报告后,浏览器提供下载功能 下面提供一下实现该功能的思路  后 ...

  4. Java导出数据到Excel文件

    Java导出数据到Excel文件 前言 如何导出 导出的基本流程 测试结果 测试数据及结果 测试代码 ExcelExportUtil.class 遇到的问题 lombok的问题 解决 Cell.set ...

  5. java导出为excel文件_java导出数据到excel文件

    有的时候,将一些有用的数据导出到excel是很有必要的.比如说,我现在在做一个学校的在线教学平台,有一个需求是:将学生成绩导出到excel文件中去. 那怎样实现用java导出数据到excel文件呢?? ...

  6. 基于EasyExcel锁定指定列导出数据到excel

    基于EasyExcel锁定指定列导出数据到excel 大家好,我是llp.最近在做系统报表时中有一个需求时这样的,需要查询系统数据导出excel,并要求导出的excel列中有一些时锁定的有一些时不锁定 ...

  7. java导出文件到excel文件怎么打开_Java导出数据到Excel文件

    Java导出数据到Excel文件需要的jar包:easypoi-0.1.3.jar, poi-3.7-20101029 package com.sais.inkaNet.reportStatistic ...

  8. java 从excel中读取数据_在Java中读取Excel文件的内容和导出数据到Excel文件中

    转自www.chianjavaworld.net 原作者:SonyMusic 读:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 在Java ...

  9. Java使用poi导出数据到excel(包括xls和xlsx两种格式)并通过浏览器下载

    情景:将数据导出到excel是java开发常用的功能,数据量不大的时候,xls和xlsx两种格式的文件都行,但是数据量太大的时候就有区别了,xls格式的文件一个sheet页最多只能存六万多条数据,而x ...

  10. java导出excel带上进度条_导出数据至Excel前台js进度条不能隐藏

    在导出数据至Excel时,有时数据会比较大,响应的时间会比较长,想做一个提示进度条,在点击导出数据按钮进,进度条显示出来,在数据导出完毕并成功弹出保存对话框时,进度条自动隐藏起来,但现在有个问题,点击 ...

最新文章

  1. tensorflow官方文档_开源分享:最好的TensorFlow入门教程
  2. jQuery的使用及关于框架造型(转)
  3. 人脸识别撞脸名画_与名画“撞脸”火爆数博会 观众直呼“太好玩”【高清组图】...
  4. C++ template类模板实现栈 pop push
  5. sharing分片集合环境搭建【MongDB系列之七】
  6. Linq to Sql : 三种事务处理方式
  7. wordpress在前台文章界面添加编辑按钮
  8. 自学 Python 到什么程度能找到工作,1300+ 条招聘信息告诉你答案
  9. 【华为云技术分享】探索软件复杂性简洁之道
  10. nginx负载均衡的方法
  11. sillyGirl拉库部署+oicq+screen稳定运行完整教程。
  12. Mac OS清除图标缓存
  13. unity使用easy ar制作ar红包
  14. alert弹框DeprecationWarning
  15. html中的注释格式是,html的注释格式是什么
  16. C4D——建宜家小闹钟
  17. 路由器 DNSMasq 替代 hosts,支持Android、iPhone、PC
  18. 密度聚类:OPTICS算法详解
  19. java 容器排序_Java攻略第四章 容器类、排序
  20. linux开启并进入Mysql

热门文章

  1. JS实现将数字金额转换为大写人民币汉字的方法
  2. DM运维踩坑实践总结
  3. win10系统如何设置局域网服务器地址,Win10怎么设置局域网IP地址
  4. 校园网显示dns服务器解析出错,天翼校园网dns解析出错怎么办
  5. 教你认识正斜杠(/)与反斜杠(\)
  6. 使用replaceAll()方法替换字符串中的反斜杠:左斜杠(\)和右斜杠(/)
  7. 网卡在linux系统下的驱动怎么安装,RedHat Linux系统如何安装无线网卡驱动
  8. 全面设防 让广播风暴远离局域网
  9. POJ 1380 Equipment Box(大矩形包含小矩形判定)
  10. 基于Python将图片转换成素描图片