java Apache Poi无法读取工作表名称
关于通过Apache Poi读取Excel表格,我们遇到了一个奇怪的错误。我们使用的是5.0版
这段代码以前是有效的,但是现在它已经停止在我们所有的生产环境中工作。它在本地测试时仍然有效,因此很难调试
问题是我们返回了空的工作表名称,因此无法正确加载所需的工作表
try (XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(venueListFile))) {
LOGGER.info("Found {} sheets", wb.getNumberOfSheets());
// First setup venues
Sheet venueSetUpSheet = wb.getSheet("Store Set Up");
List<String> sheetNames = new ArrayList<>();
for (Iterator<Sheet> it = wb.sheetIterator(); it.hasNext(); ) {
sheetNames.add(it.next().getSheetName());
}
if (venueSetUpSheet == null) {
LOGGER.warn("Sheet 'Store Set Up' not found, available sheets: '" + String.join("','", sheetNames) + "'");
} else {
LOGGER.info("Found sheets: " + String.join("','", sheetNames) + "'");
本地返回:
Found 5 sheets
Found sheets: Store Set Up','Store Open Hours','Staff Setup','TV Configurations','Sheet3'
在生产中,它返回的Excel文件相同:
Found 5 sheets
Sheet 'Store Set Up' not found, available sheets: 'null','null','null','null','null'
文件似乎已被读取,我们已测试服务器上上载的文件是否已损坏。有人知道Poi的已知问题会导致图纸名称为空吗
# 1 楼答案
XSSFSheet
基于底层的org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
。而XSSFSheet.getSheetName
只是返回org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet.getName
如果返回
null
而不是名称,则可能使用了错误的类org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
。对于apache poi 5.0.0
,它必须是CTSheet
来自jarpoi-ooxml-full-5.0.0.jar
或poi-ooxml-lite-5.0.0.jar
。它必须而不是来自ooxml-schemas-*.jar
或任何poi-ooxml-schemas-*.jar
像使用apache poi
的较低版本一样。也许你生产环境中的某个库会运送或拉取ooxml-schemas-*.jar
?这与apache poi 5.0.0
是不相容的您可以询问
ClassLoader
一个特殊类(在您的例子中是org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
)在运行时来自哪里:如果这不是
poi-ooxml-full-5.0.0.jar
或poi-ooxml-lite-5.0.0.jar
,那么您至少可以知道其他库也会提供或拉入该类如果这没有帮助,请同时检查}
org.apache.xmlbeans.*
类来自哪里^org.openxmlformats.schemas.*
类需要{使用
apache poi 5.0.0
,这个类必须来自xmlbeans-4.0.0.jar
,它必须不来自XmlBeans
的任何其他版本如果所有这些都没有帮助,你也可以用同样的方法检查
org.apache.poi.xssf.usermodel.XSSFSheet
是否真的来自apache poi 5.0.0
(poi-ooxml-5.0.0.jar
)。在您的生产环境中可能有多个apache poi
版本。这也不受支持:最后,您可以尝试从底层
CTSheet
对象获取工作表名称,如下所示:这样行吗?还是抛出例外?如果是,哪个
当然,请检查所有的错误日志。由于
Office Open XML
将数据存储在XML
中,使用Java
解析XML
时可能会出现问题?但这会引发异常,应该记录在某个地方