如何使用POI处理旧版Excel (.xls) 文件?

25

由于POI提供了更多功能,我从jxl切换到了POI。然而,我无法处理以旧格式生成的xls文件。现在我遇到了以下错误:

org.apache.poi.hssf.OldExcelFormatException: 提供的电子表格似乎是Excel 5.0/7.0 (BIFF5)格式。POI仅支持BIFF8格式(即Excel 97/2000/XP/2003版本)

现在我正在考虑根据xls版本使用JXL和POI两种方式处理,对于旧格式的xls文件,我将使用jxl,而对于新版本的xls文件,我将使用POI。这是一个好的解决方案吗?还有其他选择吗?


4
实际上,那是一个Excel 5.0/7.0文件吗? - Łukasz Rżanek
2
是的,我验证了它是一个Excel 5/7文件(Office 95)。 - Wael
2
使用单个API肯定更好,因为它会大大降低复杂性。但只有这两个是最成熟的读取Excel的API。所以根据我的意见,这是最好的方法。 - Nimble Fungus
2个回答

16

对于旧版Excel格式文件,你有以下几种替代方案:

  1. HSSF,即Excel '97(-2007)文件格式的POI实现。
    • 如果你只是想提取文本内容,那么可以使用OldExcelExtractor,它将仅从文件中提取文本和数字。
    • 如果你需要特定单元格的值,那么就需要像OldExcelExtractor一样处理文件,在记录级别上检查在OldStringRecordNumberRecordOldFormulaRecord和其他相关地方的坐标。
  2. 就像你已经提到的,JXL也可以处理一些情况。
  3. 使用JDBC/ODBC驱动程序。虽然不如HSSF灵活,但对于某些旧格式来说,这是唯一提取信息的方法。

1
文本“JDBC/ODBC”引用的链接似乎没有指向任何相关内容。 - James
1
@James 谢谢,我更新了链接到一个新的URL,似乎之前的页面已经被删除了 :( - dan
您好,感谢您的回答。我想知道是否有一种方法可以检测Excel文件的格式是否为BIFF5? - JHDev
@esprittn 你可以检查BOF(文件开头)记录。请参阅此处第43页的内容:http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/Excel97-2007BinaryFileFormat%28xls%29Specification.pdf 获取更多详细信息。 - dan

-5
依照我的知识,您可以使用这段代码来读取 .xls 格式的 Excel 文件。
FileInputStream in=new FileInputStream(new File("filename.xls"));
Wookbook wb=new HSSFWorkbook(in);

读取新的Excel版本(2007及以上):

 FileInputStream in=new FileInputStream(new File("filename.xls"));
    Wookbook wb=new XSSFWorkbook(in);

你需要的外部 jar 文件:

 1. poi-3.9 
 2. dom4j-1.6.1
 3. XMLbeams-2.5.0

如果你的工作只需要处理 .xls 文件,那么只有 poi-3.0 是足够的。你需要其他的 jar 包来处理新版本的 Excel。


我认为你指的是从旧的二进制.xls格式转换到较新的基于XML的.xlsx格式的问题,但我认为该问题是指非常旧的.xls二进制格式,POI无法读取-它可以读取更新的.xls文件-与二进制或基于XML的格式无关-只是似乎POI不支持较旧的 .xls文件。 - Volksman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接