这是一个非常普遍的问题,Apache POI FAQ 有一个条目,它甚至包括代码来找出问题所在
基本上,在你的类路径的其他地方(可能来自你的服务器),有一个旧的 Apache POI 副本。当您的代码运行时,它会触发类的加载,并且您的类加载器会毫无帮助地选择较旧的 jar,而不是较新的 jar。
如果您运行常见问题解答中的代码:
ClassLoader classloader =
org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
"org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("Core POI came from " + path);
然后这会告诉你 POI 的核心是从哪里加载的。我几乎可以保证它不会是您所期望的罐子……把旧的 POI 罐子(所有这些罐子!),那么你应该很高兴。
好吧,主要是好去处。Apache POI 3.7 已经 3 年了,所以从那时起已经有很多修复,值得考虑升级!