使用Hutool的流方式读取Excel大文件

本文介绍了如何使用Hutool的Sax模式读取Excel大文件,以避免内存溢出问题。提供了Excel07SaxReader用于处理Excel2007格式,并分享了一个名为ExcelKit的工具类代码,详细说明了调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网介绍: 

在标准的ExcelReader中,如果数据量较大,读取Excel会非常缓慢,并有可能造成内存溢出。因此针对大数据量的Excel,Hutool封装了Sax模式的读取方式。

Excel07SaxReader支持Excel2007格式的Sax读取。

参考他人博客结合使用经验,总结如下工具类ExcelKit: (类完整代码如下)

package com.xxx.app.blog.common.kit;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.poi.excel.sax.Excel07SaxReader;
import cn.hutool.poi.excel.sax.handler.RowHandler;
import java.util.*;

/**
 * ExcelKit excel文件处理库,依赖Hutool
 */
public class ExcelKit {

	private static List<Object> headLine;
	private static List<Map<String, Object>> datas = new ArrayList<>();

	/**
	 * @param pathAndName        文件路径
	 * @param idOrRidOrSheetName Excel中的sheet id或者rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果
<think>我们被要求使用Java中的ZipFile类来读取压缩包内的Excel文件。根据引用[3]和引用[4],我们知道ApachePOI库常用于处理Excel文件,而Hutool工具也可以简化一些操作。但是,用户明确要求使用ZipFile类。步骤:1.使用ZipFile打开一个ZIP文件。2.遍历ZIP文件中的条目(ZipEntry)。3.对于每一个条目,判断是否是Excel文件(通常通过文件扩展名,如.xls或.xlsx)。4.如果是Excel文件,则获取该条目的输入,并使用ApachePOI读取Excel文件内容。注意:需要处理可能出现的异常,如ZipException(引用[1])或文件损坏问题(引用[2])。示例代码结构:-使用ZipFile打开ZIP文件-遍历每个ZipEntry-检查文件名是否以.xls或.xlsx结尾-使用POI的WorkbookFactory从输入创建Workbook对象-读取Excel内容但是,用户要求的是示例代码,因此我们将提供具体的代码示例。注意:需要确保项目中已经引入了ApachePOI的相关依赖。示例代码:```javaimportjava.io.IOException;importjava.io.InputStream;importjava.util.Enumeration;importjava.util.zip.ZipEntry;importjava.util.zip.ZipException;importjava.util.zip.ZipFile;importorg.apache.poi.ss.usermodel.Workbook;importorg.apache.poi.ss.usermodel.WorkbookFactory;publicclassReadExcelFromZip{publicstaticvoidmain(String[]args){StringzipFilePath="path/to/your/file.zip";try(ZipFilezipFile=newZipFile(zipFilePath)){Enumeration<?extendsZipEntry>entries=zipFile.entries();while(entries.hasMoreElements()){ZipEntryentry=entries.nextElement();StringentryName=entry.getName().toLowerCase();//检查是否是Excel文件if(entryName.endsWith(".xls")||entryName.endsWith(".xlsx")){System.out.println("ReadingExcelfile:"+entry.getName());try(InputStreaminputStream=zipFile.getInputStream(entry)){//使用POI的WorkbookFactory自动识别xls或xlsx格式Workbookworkbook=WorkbookFactory.create(inputStream);//这里可以读取工作簿内容,例如://获取第一个工作表org.apache.poi.ss.usermodel.Sheetsheet=workbook.getSheetAt(0);//遍历行和单元格for(org.apache.poi.ss.usermodel.Rowrow:sheet){for(org.apache.poi.ss.usermodel.Cellcell:row){//根据单元格类型读取值switch(cell.getCellType()){caseSTRING:System.out.print(cell.getStringCellValue()+"\t");break;caseNUMERIC:System.out.print(cell.getNumericCellValue()+"\t");break;//其他类型处理...default:System.out.print("\t");}}System.out.println();}//关闭工作簿(注意:关闭工作簿会关闭底层,但我们在try-with-resources中已经处理了输入)workbook.close();}catch(Exceptione){System.err.println("ErrorreadingExcelfile:"+entry.getName());e.printStackTrace();}}}}catch(ZipExceptione){System.err.println("Ziperror:"+e.getMessage());}catch(IOExceptione){System.err.println("IOerror:"+e.getMessage());}}}```注意事项:1.需要引入ApachePOI的依赖,例如在Maven项目中添加:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version><!--使用最新版本--></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>```2.如果ZIP文件很大,需要注意资源管理,使用try-with-resources确保资源被关闭。3.读取Excel时,WorkbookFactory.create可以同时处理HSSF(.xls)和XSSF(.xlsx)格式。4.如果ZIP文件损坏或格式不正确,可能会抛出ZipException(引用[1])。另外,引用[2]提到有时文件会损坏,所以需要确保ZIP文件是完整的。如果遇到文件损坏,可能需要检查ZIP文件的来源。如果用户需要的是将读取Excel数据用于进一步处理,可以根据需要修改读取部分。相关问题:§§相关问题§§1.如何在Java中处理大型ZIP文件以避免内存溢出?2.除了ZipFile类,Java中还有哪些处理ZIP文件的方式?3.如何读取ZIP文件中受密码保护的Excel文件?4.在使用ApachePOI读取Excel时,如何处理不同格式的单元格数据?</think>### Java ZipFile 读取压缩包中 Excel 文件示例代码 以下是通过 `java.util.zip.ZipFile` 类读取压缩包内 Excel 文件的完整实现方案,结合 Apache POI 库解析 Excel 内容: ```java import java.io.*; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 处理.xlsx import org.apache.poi.hssf.usermodel.HSSFWorkbook; // 处理.xls public class ZipExcelReader { public static void main(String[] args) { String zipPath = "test.zip"; // 压缩包路径 String targetFile = "data.xlsx"; // 目标Excel文件名 try (ZipFile zipFile = new ZipFile(zipPath)) { // 遍历压缩包条目 Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); // 匹配目标Excel文件 if (!entry.isDirectory() && entry.getName().equals(targetFile)) { try (InputStream is = zipFile.getInputStream(entry)) { // 根据扩展名选择Workbook实现 Workbook workbook = entry.getName().endsWith(".xlsx") ? new XSSFWorkbook(is) : // XLSX格式 new HSSFWorkbook(is); // XLS格式 // 读取第一个工作表 Sheet sheet = workbook.getSheetAt(0); // 遍历行和单元格 for (Row row : sheet) { for (Cell cell : row) { // 按类型获取单元格值 switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; default: System.out.print("[未知类型]\t"); } } System.out.println(); // 换行 } workbook.close(); } break; // 找到目标文件后退出循环 } } } catch (IOException e) { // 处理压缩包损坏或格式错误 System.err.println("ZIP处理错误: " + e.getMessage()); if (e instanceof java.util.zip.ZipException) { System.err.println("可能原因:压缩包损坏或不兼容格式[^1]"); } } } } ``` #### 关键步骤说明: 1. **ZipFile 初始化** 使用 `try-with-resources` 自动关闭资源,避免内存泄漏 2. **条目遍历** 通过 `entries()` 枚举压缩包内所有文件,根据文件名过滤目标 Excel 3. **式处理** 通过 `zipFile.getInputStream()` 获取文件,**不进行临时文件解压**,减少 I/O 开销 4. **POI 动态解析** - `.xlsx` 格式 → `XSSFWorkbook` - `.xls` 格式 → `HSSFWorkbook` - 自动处理单元格数据类型(文本/数字/布尔值) #### 依赖配置(Maven): ```xml <!-- Apache POI 核心库 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <!-- XLSX 格式支持 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> ``` #### 注意事项: 1. **内存管理** 处理大型 Excel 时(>50MB),推荐使用 `SXSSFWorkbook` 式 API 避免 OOM 2. **异常处理** - 捕获 `ZipException` 处理压缩包损坏问题[^1] - 捕获 `InvalidFormatException` 处理 Excel 格式错误 3. **中文路径** 如果压缩包含中文文件名,需确保系统默认编码支持或指定编码: ```java new ZipFile(zipPath, Charset.forName("GBK")); ``` 4. **性能优化** 批量处理时建议使用 `ZipInputStream` 替代 `ZipFile`,减少内存占用[^2] ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值