XSSFSheet
基于底层的org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
. And XSSFSheet.getSheetName
只是返回org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet.getName
.
如果返回null
而不是名字,那么可能是错误的类org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
用来。为了apache poi 5.0.0
it must be CTSheet
从罐子里poi-ooxml-full-5.0.0.jar
or poi-ooxml-lite-5.0.0.jar
。它必须not来自ooxml-schemas-*.jar
or any poi-ooxml-schemas-*.jar
就像使用较低版本的apache poi
。也许您的生产环境中的某个图书馆发布或提取了任何ooxml-schemas-*.jar
?这是不兼容的apache poi 5.0.0
then.
您可以询问ClassLoader
其中一个特殊类(org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
在你的情况下)来自运行时:
...
ClassLoader classloader = org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet.class.getClassLoader();
java.net.URL res = classloader.getResource("org/openxmlformats/schemas/spreadsheetml/x2006/main/CTSheet.class");
String path = res.getPath();
System.out.println("CTSheet came from " + path);
...
如果那不是poi-ooxml-full-5.0.0.jar
or poi-ooxml-lite-5.0.0.jar
,您可能至少知道其他图书馆也发布或提取了该类。
如果这没有帮助,还请检查哪里org.apache.xmlbeans.*
类来自。XmlBeans
需要用于org.openxmlformats.schemas.*
类。
...
classloader = org.apache.xmlbeans.XmlObject.class.getClassLoader();
res = classloader.getResource("org/apache/xmlbeans/XmlObject.class");
path = res.getPath();
System.out.println("XmlObject came from " + path);
...
Using apache poi 5.0.0
, 这个班must来自xmlbeans-4.0.0.jar
它必须not来自任何其他版本XmlBeans
.
如果都没有帮助,您还可以以同样的方式检查是否org.apache.poi.xssf.usermodel.XSSFSheet
确实来自apache poi 5.0.0
(poi-ooxml-5.0.0.jar
)。也许有多个apache poi
您的生产环境中的版本。这也不支持:
...
classloader = org.apache.poi.xssf.usermodel.XSSFSheet.class.getClassLoader();
res = classloader.getResource("org/apache/poi/xssf/usermodel/XSSFSheet.class");
path = res.getPath();
System.out.println("XSSFSheet came from " + path);
...
最后,您可以尝试从底层获取工作表名称CTSheet
像这样的对象:
...
try (Workbook wb = WorkbookFactory.create(new FileInputStream("./test.xlsx"));) {
List<String> sheetNames = new ArrayList<>();
for (Iterator<Sheet> it = wb.sheetIterator(); it.hasNext(); ) {
Sheet sheet = it.next();
if (sheet instanceof org.apache.poi.xssf.usermodel.XSSFSheet) {
java.lang.reflect.Field _sheet = org.apache.poi.xssf.usermodel.XSSFSheet.class.getDeclaredField("sheet");
_sheet.setAccessible(true);
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet ctSheet =
(org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet)_sheet.get((org.apache.poi.xssf.usermodel.XSSFSheet)sheet);
org.apache.xmlbeans.impl.values.TypeStore store = ((org.apache.xmlbeans.impl.values.XmlObjectBase)ctSheet).get_store();
System.out.println(store);
org.apache.xmlbeans.SimpleValue target = (org.apache.xmlbeans.SimpleValue)store.find_attribute_user(new javax.xml.namespace.QName("", "name"));
System.out.println(target.getStringValue());
}
sheetNames.add(sheet.getSheetName());
}
System.out.println(sheetNames);
}
...
那样有用吗?或者是抛出异常?如果有,是哪一个?
当然,请检查所有错误日志中是否有错误。自从Office Open XML
将数据存储在XML
,可能解析的时候有问题XML
using Java
?但这应该会引发异常,这些异常应该记录在某处。