Могу ли я использовать jxls и Apache poi вместе?


Я делаю приложение для анализа некоторых данных, и результат должен быть представлен в файлах excel. В этом смысле я начал использовать Apache POI (3.11). Из-за того, что некоторые отчеты потребляют много времени и памяти для воспроизведения, я провел расследование и нашел jxls, после некоторого теста, который я считал решением. Но теперь я обнаружил проблему: не могу работать оба фреймворка вместе.

  1. мне нужно обновить Apache POI с 3.11 до 3.14, чтобы работать с jxls-2.3.0
  2. я сделал дополнительный пакет для того, чтобы сделать мои тесты с jxls, не проблема
  3. Я пытаюсь перенести один из моих классов из 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 2

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-схемы выше имеет приоритет вместо этого.