Могу ли я использовать 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, и импорт такой же.
Но что еще хуже, когда я попытался очистить и собрать свой проект, я получил следующую ошибку:
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, и это точно, этого класса нет. Просто чтобы увидеть, есть ли конфликт между этими двумя фреймами, я удалил из пути к классам все библиотеки, необходимые для использования jxls. Очистите и соберите снова, и это не проблема, у меня есть файл.jar для отправки клиенту, но он неполный.
Я мог бы попытаться заменить все классы, которые используют Apache POI, но это требует много работы, так как POI используется в моем проекте для многократного чтения файлов Excel с данными и для записи еще нескольких файлов для Excel. Я планировал использовать jxls, чтобы воспользоваться преимуществами шаблонов.
Я буду признателен за любую помощь или предложение.
1 ответ
Для первой ошибки может показаться, что преобразователь JXLS для Apache POI отсутствует в вашем classpath при запуске приложения. Проверьте информацию о начале работы JXLS здесь: http://jxls.sourceforge.net/getting_started.html
Как объясняется в разделе "Трансформаторы" (см. Основные понятия)), модуль ядра 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 схем ooxml POI apache для 3.11 (poi-ooxml-schemas-3.11-20141221.jar) или 3.14 (poi-ooxml-schemas-3.14-20160307.jar). В 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-схемы имели приоритет.