Могу ли я использовать jxls и Apache poi вместе?
Я делаю приложение для анализа некоторых данных, и результат должен быть представлен в файлах excel. В этом смысле я начал использовать Apache POI (3.11). Из-за того, что некоторые отчеты потребляют много времени и памяти для воспроизведения, я провел расследование и нашел jxls, после некоторого теста, который я считал решением. Но теперь я обнаружил проблему: не могу работать оба фреймворка вместе.
- мне нужно обновить Apache POI с 3.11 до 3.14, чтобы работать с jxls-2.3.0
- я сделал дополнительный пакет для того, чтобы сделать мои тесты с jxls, не проблема
-
Я пытаюсь перенести один из моих классов из Apache POI в jxls, и я получил эту ошибку:
java.lang.IllegalStateException: Cannot load XLS transformer. Please make sure a Transformer implementation is in classpath
. Вот код моего метода:private void prepareNewReport(File excelFile) { List perforaciones = makePerforacionReport .makePerforacionData(escenario);
}try (InputStream is = ReportePerforacionTotalDialog.class .getResourceAsStream("PerforacionTotal_template.xls")){ try (OutputStream os = new FileOutputStream(excelFile)) { Context context = new Context(); context.putVar("perforaciones", perforaciones); JxlsHelper.getInstance().processTemplate(is, os, context); LOGGER.logger.log(Level.INFO, "Archivo de perfortacion generado con éxito"); } } catch (IOException e) { LOGGER.logger.log(Level.SEVERE, "Problemas buscando el archivo", e); }
Как такое возможно?. В том же проекте у меня есть свой тестовый класс, просто еще один пакет и он работает нормально. Как вы можете видеть, он не так сильно отличается от примера на странице jxls, и импорт такой же.
Но еще хуже, когда я попытался сделать clean & build из моего проекта, затем я получил эту другую ошибку:
java.lang.RuntimeException: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.CTArray not found
Я просмотрел каждую библиотеку, которую я импортирую, чтобы работать с jxls и Apache poi, и вот rigth, этого класса там нет. Просто чтобы увидеть, есть ли конфликт между этими двумя фреймвоксами, я исключил из пути класса все библиотеки, необходимые для использования jxls. Очистить и построить снова, и не проблема, у меня есть свой .файл jar для отправки моему клиенту, но неполный.
Я мог бы попытаться заменить все классы, которые используют Apache POI, но это означает много работы, так как POI используется в моем проекте для чтения файлов excel с данными много раз и для записи еще многих файлов в excel. Я планировал использовать jxls,чтобы воспользоваться преимуществами шаблонов use.
Я буду благодарен за любую помощь или предложение.1 ответ:
В случае первой ошибки может показаться, что трансформатор JXLS для Apache POI отсутствует в пути к классу при запуске приложения. Проверьте информацию о начале работы JXLS здесь: http://jxls.sourceforge.net/getting_started.html
Как поясняется в разделе Transformers (см. Основные понятия)) модуль ядра Jxls не зависит от какой-либо конкретной библиотеки Java-Excel и работает с Excel исключительно через предопределенный интерфейс. В настоящее время Jxls поставляет два реализация этого интерфейса в отдельных модулях основана на известных библиотеках Apache POI и Java Excel API.
Если вы используете maven, обязательно включите его в свой pom.xml зависимость jxls-poi, указанная на странице jxls начало работы:
<dependency> <groupId>org.jxls</groupId> <artifactId>jxls-poi</artifactId> <version>1.0.9</version> </dependency>
Для второй проблемы,
org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.CTArray
не находится в файлах jar Apache POI ooxml schemas для любого 3.11 (poi-ooxml-schemas-3.11-20141221.jar) или 3.14 (poi-ooxml-schemas-3.14-20160307.кувшин). POI использует урезанный набор ooxml классы схем, вам нужно будет получить полный jar схемы ooxml из http://central.maven.org/maven2/org/apache/poi/ooxml-schemas/1.3/ или если вы используете maven (или другой инструмент сборки), получите зависимость для своей сборки из https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas/1.3Например, для maven:
<!-- https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-schemas</artifactId> <version>1.3</version> </dependency>
Обязательно удалите зависимость poi-ooxml-schemas из вашего Maven pom.xml, так что ooxml-схемы выше имеет приоритет вместо этого.