У нас есть приложение для составления отчетов, которое по умолчанию генерирует выходные данные в формате pdf, но вы можете написать свои собственные классы для создания любого другого выходного формата.Таким образом, я сгенерировал xls файлы, используя apache poi 10.0.Но теперь пришел запрос на создание файла xlsx.Когда я пытаюсь создать книгу с этим кодом:
XSSFWorkbook wbTemplate=new XSSFWorkbook()
Я получил ошибку:
java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveAggressiveNamespaces()Lorg/apache/xmlbeans/XmlOptions;
Я обнаружил, что приложение уже использует очень старую версию файла xmlbeansэто, конечно, не содержит вышеуказанный метод.Сначала я попытался заменить файл XML-компонента новой версией на случай, если мне повезет, но приложение зависнет.
Моя следующая идея - использовать 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) не существует.Но setSaveAggressiveNamespaces должен быть в классе, так как он идет с пакетом apache poi.
Что я могу сделать в этом случае, чтобы он работал?Приложение работает под Java 1.6
Заранее спасибо за ответы.
ОБНОВЛЕНИЕ
Аксель, вот как яТеперь загрузите класс:
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);
}
И затем я вызываю вышеупомянутую функцию в первой строке класса, который генерирует отчет.Перед ним ничего нет.
Ресурс записывается в журнал как: "РЕСУРСЫ: jar: file: / C: / HOME / Installs / Apache POI / poi-3.10 / ooxml-lib / xmlbeans-2.3.0.jar! /org/apache/xmlbeans/XmlOptions.class "