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

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

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

Буду признателен за любую помощь или предложение.


person José Castillo    schedule 07.07.2016    source источник


Ответы (1)


Для первой ошибки может показаться, что преобразователь JXLS для Apache POI отсутствует в вашем пути к классам при запуске приложения. Информацию о начале работы с 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 схем apache POI ooxml для 3.11 (poi-ooxml-schemas-3.11-20141221.jar) или 3.14 (poi-ooxml-schemas-3.14-20160307.jar). POI использует урезанный набор классов схемы ooxml, вам нужно будет получить полную банку схем 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-schemas, указанные выше, имели приоритет.

person Finbarr O'B    schedule 08.07.2016
comment
Я проверил, сказал ли мне Финбарр О'Б. Я решил вторую проблему с его рекомендацией, но импорт, который я в конце концов сделал, был ooxml.schemas-1.1.jar, 1.3, поскольку он рекомендует, не содержит ни одного класса CTArray. Но важной была первая ошибка, настоящая проблема заключалась в том, что метод getResourcesAsStream () не нашел файл, но сообщенная ошибка была ошибочной. После того, как я исправил путь, по которому находился файл, проблема исчезла. - person José Castillo; 08.07.2016