翻了好久都没找到java 实现easyExcel动态创建sheet,那写一个。

要知道以 .xlsx结尾的excel文件每个sheet 只能写104万左右的数据量,

如果想要写入500W条数据到excel,要么分到多个sheet中,每个sheet存100w左右数据,5个sheet存储完;

要么写到五个xlsx文件中,这可能不是想要的。所以写入到同一个表格文件不同的sheet中去。

封装的easyexcel只用于写数据,只要内存和硬盘足够大,亿万条数据也不在话下,但是无实际意义吧。

另外我测试创建500个sheet 都去写数据,发现也是可以的。


目录

1.添加easyexcel依赖

2.封装easyExcel处理工具类

3.使用工具类

4.结果展示


1.添加easyexcel依赖

    <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.0.5</version></dependency><!--配合插件lombok 使用--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version><scope>provided</scope></dependency>

2.封装easyExcel处理工具类


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;import java.io.File;
import java.util.ArrayList;
import java.util.List;/*** 通用 excel 写操作模板*/
public class ExcelHandler {private List<WriteSheet> sheets;    //excel的sheet集合private String dirName;             //excel存放的文件夹 默认文件夹my_excelprivate static final int DEFAULT_PER_SHEET_NUM = 1000000;//默认每个sheet存储的行数/*** 对象创建,生成excel时,文件默认存放的文件夹"my_excel"*/public ExcelHandler() {}/*** 对象创建,生成excel时,excel文件指定存放的文件夹,文件夹可以多级 folderName:"aa/bb/cc"** @param folderName*/public ExcelHandler(String folderName) {dirName = folderName;}/*** 创建excel和sheet,创建时可以指定sheet 数量** @param excelName* @param clazz* @param numSheet* @return* @throws Exception*/public ExcelWriter create(String excelName, Class clazz, int numSheet) throws Exception {ExcelWriter excelWriter = EasyExcel.write(route(excelName), clazz.asSubclass(clazz)).build();createSheets(numSheet);return excelWriter;}/*** 创建excel和sheet,sheet 数量默认 5, 最高可存放500W 行左右的数据,受每个sheet存放数据的限制** @param excelName* @param clazz* @return* @throws Exception*/public ExcelWriter create(String excelName, Class clazz) throws Exception {ExcelWriter excelWriter = EasyExcel.write(route(excelName), clazz.asSubclass(clazz)).build();createSheets(5);return excelWriter;}/*** 写数据到excel,仅使用一个sheet,不可用于百万以上数据** @param excelWriter* @param list*/public void write(ExcelWriter excelWriter, List list) throws Exception {excelWriter.write(list, sheets.get(0));}/*** 写数据到excel** @param excelWriter* @param list        每一次的数据* @param resize      动态调整大小*/public void write(ExcelWriter excelWriter, List list, int resize) throws Exception {int index = resize / (DEFAULT_PER_SHEET_NUM + 1);excelWriter.write(list, sheets.get(index));}/*** 写完数据关闭(finish 有关流操作),必须的操作** @param excelWriter*/public void finish(ExcelWriter excelWriter) {excelWriter.finish();}/*** 创建指定数量的sheet** @param num sheet的数量*/private void createSheets(int num) {sheets = new ArrayList<>();for (int i = 1; i <= num; i++) {WriteSheet sheet = EasyExcel.writerSheet(i, "sheet" + i).build();sheets.add(sheet);}}/*** 表格存放路径** @param excelName* @return*/private String route(String excelName) {if (null == dirName) {dirName = "my_excel";}String filePath = dirName + "/";File fp = new File(filePath);if (!fp.exists()) {// 目录的创建fp.mkdirs();}return filePath + excelName + ".xlsx";}
}

3.使用工具类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 用户实体类*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ContentRowHeight(15)
@HeadRowHeight(20)
@ColumnWidth(25)
public class Data1 {@ExcelProperty("账号")private String account;@ExcelProperty("密码")private String password;}


import com.alibaba.excel.ExcelWriter;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {Test t = new Test();t.test00();t.test01();}/*** 模拟百万以下数据导入到excel*/private void test00() {int num = 0;ExcelHandler handler = null;ExcelWriter excelWriter = null;try {//创建handler对象--参数文件夹名handler = new ExcelHandler("test_00");excelWriter = handler.create("记录", Data1.class);List<Data1> list = new ArrayList<>(1024);//方式一:一次性导出/*   for (int i = 0; i < 1000000; i++) {//总数据 100W条num++;list.add(new Data1("张三" + num, "123abc" + num));}handler.write(excelWriter, list);*///方式二:分多次导出     为了降低导出过程中的内存资源,也可以这样for (int a = 0; a < 100; a++) {//模拟拿100 次数据for (int i = 0; i < 10000; i++) {//模拟一次拿的数据num++;list.add(new Data1("张三" + num, "123abc" + num));}handler.write(excelWriter, list);list.clear();//必须clear,否则数据会重复}} catch (Exception ex) {ex.printStackTrace();} finally {if (null != excelWriter) {handler.finish(excelWriter);}}}/*** 模拟百万以上数据导入到excel*/private void test01() {int count = 0;int num = 0;ExcelHandler handler = null;ExcelWriter excelWriter = null;try {//创建handler对象--参数:文件夹名handler = new ExcelHandler("test_001");excelWriter = handler.create("记录", Data1.class, 10);List<Data1> list = new ArrayList<>(1024);//此处依旧可以模仿test00()去优化for (int t = 0; t < 10; t++) {//模拟分页页数 每页50W数据for (int i = 0; i < 500000; i++) {//模拟每次数据量num++;list.add(new Data1("张三" + num, "123abc" + num));}//count 将控制插入哪一个sheetcount += list.size();handler.write(excelWriter, list, count);list.clear();//必须clear,否则数据会重复}} catch (Exception ex) {ex.printStackTrace();} finally {if (null != excelWriter) {handler.finish(excelWriter);}}}
}

4.结果展示


备注:1.工具适用于数据导出,百万以下数据 看test00()方法的测试,百万,千万,亿万使用 test01()方法的测试。

当然也可以修改工具类达到自己的要求。

2.如果不使用lombok插件,记得写相关的get,set,构造等方法。

放上资源连接  代码,如有需要可以获取,资源和以上代码基本一样。

千万级数据导出Excel相关推荐

  1. 阿里开源百万级数据导出Excel表格 三步简单导出 附官方文档

    阿里巴巴Excel导出优化速度 ,64M内存20秒读取75M(46W行25列)的Excel(3.0.2+版本) 官方文档:EasyExcel · 语雀EasyExcel是一个基于Java的简单.省内存 ...

  2. .net千万级数据导出_记一次解决docker下oracle数据库故障事例

    一.问题背景: 某个项目的线上环境oracle数据库挂了,同事急匆匆来找我救火.我简单咨询了一些基本情况:线上环境,docker部署,已正常运行半年.由于宿主机的根目录硬盘空间不够,运维的同事想把or ...

  3. Java 亿万级数据导出到Excel

    由于项目需要,处理百万级数据导出问题. 直接开始撸代码~ 导入依赖 <!-- 文件导出--><dependency><groupId>org.apache.poi& ...

  4. java excel 使用ExcelWriter 百万级数据导出

    一.Java 通过hutool工具类ExcelWriter 导出 运用到多线程分页查询 这个采用的是Java的utool工具类ExcelWriter 导出 踩过一些坑,尽量用一条sql 将所有数据查询 ...

  5. 前端万级数据量表格预览及前端导出Excel方案、组件封装(基于vxetable虚拟滚动和web worker)

    如题,本文主要解决前端展示渲染大数据量table数据及导出Excel的问题,主要是通过使用v3版本的vxetable和webworker来实现的.亲测可以表格可渲染30w条数据,可在10s内导出30w ...

  6. (转).NET导出Excel的四种方法及评测

    .NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...

  7. JXLS导出Excel(模板导出)

    1.导包 在pom.xml中加入依赖如下: <dependency><groupId>org.jxls</groupId><artifactId>jxl ...

  8. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  9. .net npoi xssfclientanchor设置图片缩放大小_.NET导出Excel的四种方法及评测

    前言 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspose.Cells四个市面上常见的库 ...

最新文章

  1. 双linux grub rescue,Grub Rescue修复方法
  2. ML之回归预测:利用两种机器学习算法(LiR,XGBoost(调优+重要性可视化+特征选择模型))对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值
  3. AJAX的表单请求POST请求方式
  4. static_cast、dynamic_cast、const_cast和reinterpret_cast总结
  5. 联想服务器开机自动重启,解决联想电脑开机一半自动重启的方法
  6. 网络协议分层及报文格式大全
  7. linux 安装mysql5.7.12_Linux系统上安装mysql5.7.12
  8. Linux不能读取目录,关于Linux上面无法读取资源目录下文件的问题
  9. [知识整理]Linux系统WIFI知识的一些整理
  10. 接口测试工具--apipost预/后执行脚本
  11. 基于matlab的自适应滤波器,基于MATLAB的自适应滤波器的设计与实现.doc
  12. 2D武侠游戏《剑侠世界》网游单机 搭建教程说明
  13. 【 OpenCV】——图像平移
  14. 使用Photoshop变化一张图片的颜色深浅
  15. [Andoid][踩坑]CTS 11_r3开始出现的testBootClassPathAndSystemServerClasspath_nonDuplicateClasses FAIL问题分析
  16. 1091: 童年生活二三事(多实例测试)Python
  17. 面孔“暴露”在外 人脸识别风险谁来“买单”?
  18. JS 打开本地程序及文件
  19. MySQL按时间段随机更新时间
  20. 胜博发公益:只要用手机就能随手做公益 苹果与许多公益团体合作

热门文章

  1. 程序员高考试卷!你满分了吗?
  2. 简单开发调用百度翻译api(java)
  3. Vscode 调试TS
  4. java中switch语句常量_Java switch语句:需要常量表达式,但它是常量
  5. linux x11 命令,linux-X11配置.doc
  6. 迁移学习:《SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION》
  7. Loading Large Bitmaps Efficiently(官方文档)
  8. 计算机视觉(相机标定)-2.1 摄像机标定
  9. 用c语言编程点亮7个二极管,树莓派4B C语言编程实现GPIO点亮LED发光二极管(LED灯)...
  10. 路由器的中继模式Repeater和桥接模式Bridge有什么区别