# excel **Repository Path**: allenpwd/excel ## Basic Information - **Project Name**: excel - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-10-08 - **Last Updated**: 2024-01-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### jxls - 官方文档:http://jxls.sourceforge.net/ ### easyexcel EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 - 官方文档:https://www.yuque.com/easyexcel/doc/easyexcel Java解析、生成Excel比较有名的框架有Apache poi、jxl。\ 但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,\ 但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。\ easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出。 ### Workbook分类 #### 第一种:HSSFWorkbook 针对是 EXCEL2003 版本,扩展名为 .xls;所以 此种的局限就是 导出的行数 至多为 65535 行,此种 因为行数不足七万行 所以 一般不会发生 内存不足的情况(OOM) #### 第二种:XSSFWorkbook 这种形式的出现 是由于 第一种HSSFWorkbook 的局限性而产生的,因为其所导出的行数比较少,所以 XSSFWookbook应运而生 其 对应的是EXCEL2007+(1048576行,16384列)扩展名 .xlsx,最多可以 导出 104 万行,不过 这样 就伴随着一个问题---OOM 内存溢出,原因是 你所 创建的 book sheet row cell 等 此时是存在 内存的 并没有 持久化,那么 随着 数据量增大 内存的需求量也就增大,那么很大可能就是要 OOM了,那么 怎么解决呢? #### 第三种:SXSSFWorkbook  poi.jar 3.8+ 第二种遇到的问题该如何解决呢? 因为数据量过大 导致内存吃不消 那么 可以 让内存 到量持久化 吗? \ 输入的时候我查阅了poi的api发现一般是不能大批量数据输入的,但是poi的2007支持大数据处理 ``` Workbook wb = new SXSSFWorkbook(5000); ``` 在生成Workbook 时给工作簿一个内存数据存在条数,这样一旦这个Workbook 中数据量超过5000就会写入到磁盘中,减少内存的使用量来提高速度和避免溢出。 ##### 报错:Attempting to write a row[?] in the range [0,?]that is already written to disk 报错原因:当前要创建的行小于等于最近已经创建的行时,就会抛出异常。SXSSFWorkbook其本身实现方式在于,不断的将一定行数的表格写入临时文档,最终将所有的临时文档合并起来,这种方式中保证了内存的占用数理想,并且导出的效率也比较理想。在这种实现中,如果一个行已经写入临时文档了,就不能再修改了,因此在源代码中直接限制了重复创建并写同一栏,并在此抛出异常。 解决方法: 方法一:使用XSSFWorkbook替代SXSSFWorkbook 方法二:对sheet设置一下无限制访问 ```java SXSSFSheet sheet = workbook.createSheet(sheetName); sheet.setRandomAccessWindowSize(-1); ```