Могу ли я использовать 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, и импорт такой же.

Но что еще хуже, когда я попытался очистить и собрать свой проект, я получил следующую ошибку:

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-схемы имели приоритет.

Другие вопросы по тегам