Spring, JXLS: преобразователь XLS не загружен, хотя зависимость существует.

Я пытаюсь использовать JXLS, которая представляет собой библиотеку Java для создания файлов Excel и других операций с это в проекте Spring-MVC. Когда я пытаюсь создать файл excel из некоторых данных, я получаю следующую ошибку:

Журнал ошибок :

java.lang.IllegalStateException: Cannot load XLS transformer. Please make sure a Transformer implementation is in classpath
    at org.jxls.util.JxlsHelper.createTransformer(JxlsHelper.java:200)
    at org.jxls.util.JxlsHelper.processTemplateAtCell(JxlsHelper.java:118)
    at com.journaldev.spring.service.GroupNotesServiceImpl.saveGroupNotesToExcel(GroupNotesServiceImpl.java:917)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)

Код :

   @Override
    public void saveGroupNotesToExcel(int msectionid){
        List<GroupNotes> groupNotesList = this.groupNotesDAO.listGroupNotesBySectionId(msectionid);
            try(InputStream is = GroupNotesServiceImpl.class.getResourceAsStream("/home/path/to/jls/test.xls")) {
                try (OutputStream os = new FileOutputStream("/home/path/to/jls/output.xls")) {
                    Context context = new Context();
                    context.putVar("groupNotesList", groupNotesList);
                    JxlsHelper.getInstance().processTemplateAtCell(is, os, context, "Result!A1");
                }catch (Exception e){
                    e.printStackTrace();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
    }

Вот мой POM.xml с зависимостями:

  <!-- Excel dependencies-->
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls</artifactId>
            <version>2.2.8</version>
        </dependency>

     <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-poi</artifactId>
            <version>1.0.7</version>
        </dependency>
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-jexcel</artifactId>
            <version>1.0.4</version>
        </dependency>

        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-reader</artifactId>
            <version>2.0.1</version>
        </dependency>

Я проверил другие ответы в сети, но там была только одна отсутствующая зависимость, которая у меня уже есть. Что здесь происходит не так?


person We are Borg    schedule 25.01.2016    source источник


Ответы (5)


Проблема, с которой я столкнулся, по какой-то причине заключалась в том, что получение ресурса в виде потока не сработало. Он всегда будет возвращать ноль.

Изменение моего кода, чтобы получить входной поток, решило мою проблему:

URL fileResource = this.getClass().getClassLoader().getResource("MyTemplate.xlsx");

File file = new File(fileResource.toURI());

InputStream is = new FileInputStream(file);

Моя рекомендация, если это не решит вашу проблему, состоит в том, чтобы отладить код jxls и посмотреть, где он возвращает нуль, и убедиться, что ни один из других входов не является нулевым в этот момент. Эта ошибка просто означает, что допустимый преобразователь не удалось создать, а не то, что он не существует на пути к классу. Я понятия не имею, почему они сделали исключение таким вводящим в заблуждение.

person Taugenichts    schedule 29.02.2016

Я тоже столкнулся с этой проблемой, и мой файл шаблона был помещен в папку src/main/resources.

После того, как я изменил код с

InputStream is = JxlsTest.class.getResourceAsStream("object_collection_template.xls");

(приведенный выше код не может прочитать файл шаблона), чтобы

InputStream is = JxlsTest.class.getResourceAsStream("/object_collection_template.xls");

эта ошибка исчезнет.

person frank    schedule 07.09.2016

Ява:

List<Employee> employees = initEmployees();
try {
    InputStream is = new FileInputStream(new File("/Users/Yasin/Downloads/template.xlsx"));
    OutputStream os = new FileOutputStream(new File("/Users/Yasin/Downloads/formulas_output.xlsx"));
    Context context = new Context();
    context.putVar("employees", employees);
    JxlsHelper.getInstance().processTemplateAtCell(is, os, context, "Result!A1");

} catch (Exception ex) {
    ex.printStackTrace();
}

XML:

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.4.3</version>
</dependency>

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>1.0.14</version>
</dependency>

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-jexcel</artifactId>
    <version>1.0.6</version>
</dependency>

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-reader</artifactId>
    <version>2.0.3</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>3.17</version>
</dependency>
person 孙永生    schedule 05.03.2018

Вот мои зависимости для чтения и записи документов Excel, попробуйте

        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls</artifactId>
            <version>2.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-reader</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-poi</artifactId>
            <version>1.0.6</version>
        </dependency>
person Vladimir Dergachev    schedule 25.01.2016
comment
Извините, все та же ошибка в JxlsHelper.getInstance. Я даже запустил mvn clean && mvn install перед запуском проекта, но не повезло. - person We are Borg; 25.01.2016
comment
jxls может использовать только одну реализацию poi или jexcel, поэтому вам нужно решить, какую из них использовать. Я сейчас использую пои. - person Vladimir Dergachev; 25.01.2016
comment
Я не знаю, какой из них я использую, к сожалению. Как я могу это определить? У меня нет ничего POI, кроме jxls-poi в pom.xml, я его искал. - person We are Borg; 25.01.2016
comment
Не подскажете, как и какой использовать? Благодарю вас! - person We are Borg; 25.01.2016
comment
попробуйте удалить или прокомментировать блок зависимостей в xml с помощью jxls-jexcel и jxls-reader. сделать mvn чистой установкой - person Vladimir Dergachev; 25.01.2016
comment
Я сохранил только одну зависимость, то есть jxls org.jxl с версией 2.2.8. Все равно не повезло. - person We are Borg; 25.01.2016
comment
Давайте продолжим обсуждение в чате. - person Vladimir Dergachev; 25.01.2016
comment
Проблема решена после использования Apache-POI. Спасибо за ваши усилия. :-) - person We are Borg; 25.01.2016

Много пробовал и решил проблемы, но добавил приведенный ниже список зависимостей JAR, используемый для решения этой проблемы.

  1. 1.commons-codec-1.10.jar 2.commons-collections4-4.1.jar 3.commons-jexl-2.1.1.jar 4.commons-logging-1.2.jar 5.jxls-2.4.0.jar 6.jxls -jexcel-1.0.6.jar 7.jxls-poi-1.0.12.jar 8.jxls-reader-2.0.2.jar 9.poi-3.14.jar 10.poi-ooxml-3.15.jar 11.slf4j- API-1.6.6.jar
person Manikandarajan    schedule 24.04.2017