使用Java POI读取XLS文件失败,请求问题排查帮助
问题排查与解决方案
我来帮你梳理下这个问题的核心原因和解决办法,结合你的代码和异常信息来看,主要问题出在文件读取的对象上:
1. 最可能的根因:你读取的是ZIP压缩包,而非里面的XLS文件
你提供的链接指向的是wy_foreclosure.zip压缩包,而非直接的Excel文件。如果你的fileName变量指向的是这个ZIP包,POI会把它当作Excel格式解析,自然会抛出格式错误——毕竟ZIP的文件结构和XLS完全不兼容,这也是异常提示"Not enough data"的核心原因。
2. 具体解决步骤
方法一:手动解压后读取
- 先把
wy_foreclosure.zip解压,找到里面的XLS文件(比如wy_foreclosure.xls) - 修改代码中的
fileName为解压后的XLS文件路径,再重新运行
方法二:代码内直接读取ZIP中的Excel文件
如果不想手动解压,可以用ZipInputStream直接读取压缩包内的XLS文件,示例代码如下:
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import java.io.FileInputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ForeClosureDump { public static void generateStatistics() { String zipFilePath = "wy_foreclosure.zip"; // 你的ZIP文件路径 try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath))) { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { // 过滤出压缩包内的XLS文件 if (!entry.isDirectory() && entry.getName().toLowerCase().endsWith(".xls")) { try (Workbook wb = WorkbookFactory.create(zis)) { // 在这里处理你的Workbook业务逻辑 System.out.println("成功读取Excel文件,工作表数量:" + wb.getNumberOfSheets()); } zis.closeEntry(); break; // 假设压缩包内只有一个XLS文件,找到后退出循环 } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { generateStatistics(); } }
3. 你的原代码优化点
你原代码里同时创建了FileInputStream和直接用File初始化Workbook,这是冗余操作,还可能导致资源冲突。建议只保留一种方式(比如直接传入File对象,或者用InputStream),避免不必要的资源消耗。
4. 额外验证项
- 手动打开解压后的XLS文件,确认它能正常用Excel打开,排除文件本身损坏的可能
- 检查POI依赖版本,建议使用稳定的新版本(比如4.1.2或5.2.3),避免旧版本的解析bug
内容的提问来源于stack exchange,提问作者Syed Rafi
相关产品推荐
相关产品推荐

