【JAVA问题解决方案】01.EasyExcel导出数据超过Excel单表上限解决方案
陈老老老板 说明:新专栏专门记录一些在工作中遇到的问题,对于一些问题的思考,同时进行解读。
本文是介绍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单表上限解决方案相关推荐
- EasyExcel 导出数据超过 Excel 单表上限了,该怎么办???
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...
- EasyExcel导出数据超过Excel单表上限时进行分表
解决的问题 Excel单表最多可以存储1048576条数据 如果超过这个多条数据则进行Excel分表. 分表的同时需要对数据进行分割,来保证不超过Excel最大存储条数. 实体类(测试用,非常简单) ...
- EasyExcel导出数据到Excel,浏览器提供下载
最近的一个项目需求,需要为用户提供一个导出数据功能,点击批量下载按钮,将所选中的数据导入到Excel文档中供用户下载.如下图 点击批量下载报告后,浏览器提供下载功能 下面提供一下实现该功能的思路 后 ...
- Java导出数据到Excel文件
Java导出数据到Excel文件 前言 如何导出 导出的基本流程 测试结果 测试数据及结果 测试代码 ExcelExportUtil.class 遇到的问题 lombok的问题 解决 Cell.set ...
- java导出为excel文件_java导出数据到excel文件
有的时候,将一些有用的数据导出到excel是很有必要的.比如说,我现在在做一个学校的在线教学平台,有一个需求是:将学生成绩导出到excel文件中去. 那怎样实现用java导出数据到excel文件呢?? ...
- 基于EasyExcel锁定指定列导出数据到excel
基于EasyExcel锁定指定列导出数据到excel 大家好,我是llp.最近在做系统报表时中有一个需求时这样的,需要查询系统数据导出excel,并要求导出的excel列中有一些时锁定的有一些时不锁定 ...
- java导出文件到excel文件怎么打开_Java导出数据到Excel文件
Java导出数据到Excel文件需要的jar包:easypoi-0.1.3.jar, poi-3.7-20101029 package com.sais.inkaNet.reportStatistic ...
- java 从excel中读取数据_在Java中读取Excel文件的内容和导出数据到Excel文件中
转自www.chianjavaworld.net 原作者:SonyMusic 读:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 在Java ...
- Java使用poi导出数据到excel(包括xls和xlsx两种格式)并通过浏览器下载
情景:将数据导出到excel是java开发常用的功能,数据量不大的时候,xls和xlsx两种格式的文件都行,但是数据量太大的时候就有区别了,xls格式的文件一个sheet页最多只能存六万多条数据,而x ...
- java导出excel带上进度条_导出数据至Excel前台js进度条不能隐藏
在导出数据至Excel时,有时数据会比较大,响应的时间会比较长,想做一个提示进度条,在点击导出数据按钮进,进度条显示出来,在数据导出完毕并成功弹出保存对话框时,进度条自动隐藏起来,但现在有个问题,点击 ...
最新文章
- tensorflow官方文档_开源分享:最好的TensorFlow入门教程
- jQuery的使用及关于框架造型(转)
- 人脸识别撞脸名画_与名画“撞脸”火爆数博会 观众直呼“太好玩”【高清组图】...
- C++ template类模板实现栈 pop push
- sharing分片集合环境搭建【MongDB系列之七】
- Linq to Sql : 三种事务处理方式
- wordpress在前台文章界面添加编辑按钮
- 自学 Python 到什么程度能找到工作,1300+ 条招聘信息告诉你答案
- 【华为云技术分享】探索软件复杂性简洁之道
- nginx负载均衡的方法
- sillyGirl拉库部署+oicq+screen稳定运行完整教程。
- Mac OS清除图标缓存
- unity使用easy ar制作ar红包
- alert弹框DeprecationWarning
- html中的注释格式是,html的注释格式是什么
- C4D——建宜家小闹钟
- 路由器 DNSMasq 替代 hosts,支持Android、iPhone、PC
- 密度聚类:OPTICS算法详解
- java 容器排序_Java攻略第四章 容器类、排序
- linux开启并进入Mysql
热门文章
- JS实现将数字金额转换为大写人民币汉字的方法
- DM运维踩坑实践总结
- win10系统如何设置局域网服务器地址,Win10怎么设置局域网IP地址
- 校园网显示dns服务器解析出错,天翼校园网dns解析出错怎么办
- 教你认识正斜杠(/)与反斜杠(\)
- 使用replaceAll()方法替换字符串中的反斜杠:左斜杠(\)和右斜杠(/)
- 网卡在linux系统下的驱动怎么安装,RedHat Linux系统如何安装无线网卡驱动
- 全面设防 让广播风暴远离局域网
- POJ 1380 Equipment Box(大矩形包含小矩形判定)
- 基于Python将图片转换成素描图片