我们有一个报告应用程序,默认生成pdf输出,但您可以编写自己的类来生成任何其他输出格式。因此,我使用apache poi 10.0生成了xls文件。但是,现在出现了生成xlsx文件的请求。当我尝试使用以下代码创建工作簿时:
我发现应用程序使用的是一个非常老的xmlbeans文件版本,当然不包含上述方法。首先,我尝试用更新的版本替换xml bean文件,希望能有好运气,但应用程序却冻结了。
我的下一个想法是使用classLoader,当应用程序运行我的类以生成xlsx文件时,我加载上述方法。为此,我实现了在互联网上找到的这个解决方案:
但是很惊讶的是,当它要获取“setSaveAggressiveNamespaces”方法名称时,我再次得到了该函数不存在的错误。然后,我将这个类的所有函数名写入文件中,确实发现这个名称不存在。但还有另一个名为“setSaveAggresiveNamespaces”的函数,只有一个S!如果我调用它,它就会起作用,但当我要创建XSSF工作簿时,仍然会出现“setSaveAggressiveNamespaces”(有两个SS)不存在的消息。但是,既然这是与apache poi软件包一起提供的,所以setSaveAggressiveNamespaces应该在类中。
在这种情况下我该怎么办才能使它工作? 应用程序运行在java 1.6下。
谢谢您的回答。
更新: Axel,这是我现在如何加载类的方式:
XSSFWorkbook wbTemplate=new XSSFWorkbook()
I got the error:
java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveAggressiveNamespaces()Lorg/apache/xmlbeans/XmlOptions;
我发现应用程序使用的是一个非常老的xmlbeans文件版本,当然不包含上述方法。首先,我尝试用更新的版本替换xml bean文件,希望能有好运气,但应用程序却冻结了。
我的下一个想法是使用classLoader,当应用程序运行我的类以生成xlsx文件时,我加载上述方法。为此,我实现了在互联网上找到的这个解决方案:
URL[] classLoaderUrls = new URL[]{new URL("file:/C:/HOME/Installs/Apache POI/poi-3.10/ooxml-lib/xmlbeans-2.6.0.jar")};
URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls);
Class<?> beanClass = urlClassLoader.loadClass("org.apache.xmlbeans.XmlOptions");
Constructor<?> constructor = beanClass.getConstructor();
Object beanObj = constructor.newInstance();
Method[] m=beanClass.getMethods();
Method method = beanClass.getMethod("setSaveAggressiveNamespaces");
method.invoke(beanObj);
但是很惊讶的是,当它要获取“setSaveAggressiveNamespaces”方法名称时,我再次得到了该函数不存在的错误。然后,我将这个类的所有函数名写入文件中,确实发现这个名称不存在。但还有另一个名为“setSaveAggresiveNamespaces”的函数,只有一个S!如果我调用它,它就会起作用,但当我要创建XSSF工作簿时,仍然会出现“setSaveAggressiveNamespaces”(有两个SS)不存在的消息。但是,既然这是与apache poi软件包一起提供的,所以setSaveAggressiveNamespaces应该在类中。
在这种情况下我该怎么办才能使它工作? 应用程序运行在java 1.6下。
谢谢您的回答。
更新: Axel,这是我现在如何加载类的方式:
public void customClassLoader() throws Exception
{
URL[] classLoaderUrls = new URL[]{new URL("file:/C:/HOME/Installs/Apache POI/poi-3.10/ooxml-lib/xmlbeans-2.3.0.jar")};
URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls,null);
Class<?> beanClass = urlClassLoader.loadClass("org.apache.xmlbeans.XmlOptions");
log("RESOURCES:" +beanClass.getResource("/org/apache/xmlbeans/XmlOptions.class"));
Constructor<?> constructor = beanClass.getConstructor();
Object beanObj = constructor.newInstance();
Method[] m=beanClass.getMethods();
for (int i=0;i<m.length;++i)
log("QQQ:" +String.valueOf(i)+".: "+ m[i].getName());
Method method = beanClass.getMethod("setSaveAggressiveNamespaces");
method.invoke(beanObj);
}
然后我在生成报告的类的第一行调用上述函数。在它之前没有任何内容。
资源写入日志中的内容为: "RESOURCES:jar:file:/C:/HOME/Installs/Apache POI/poi-3.10/ooxml-lib/xmlbeans-2.3.0.jar!/org/apache/xmlbeans/XmlOptions.class"