java - 我可以在 Jxls 2+ 中的模板和输出格式中使用 .XLSX 吗?

标签 java excel jxls

在 jXLS 1+ 中,我使用 .XLSX 模板和输出文件;效果很好。但在 Jxls 2+ 中则不然。所以我准备了模板并重写了代码。如果我使用 .XLS 它工作得很好,如果我将模板更改为 .XLSX,它会出现问题:

    2018-06-26 11:56:33,827 ERROR [main] TransformerFactory - Method createTransformer of org.jxls.transform.poi.PoiTransformer class thrown an Exception
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.jxls.util.TransformerFactory.createTransformer(TransformerFactory.java:35)
    at org.jxls.util.JxlsHelper.createTransformer(JxlsHelper.java:381)
    at org.jxls.util.JxlsHelper.processTemplate(JxlsHelper.java:173)
...
Caused by: java.lang.ClassNotFoundException: org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument$Factory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 25 more
2018-06-26 11:56:33,830 ERROR [main] ExcelBuilder - Cannot load XLS transformer. Please make sure a Transformer implementation is in classpath
java.lang.IllegalStateException: Cannot load XLS transformer. Please make sure a Transformer implementation is in classpath
    at org.jxls.util.JxlsHelper.createTransformer(JxlsHelper.java:383)
    at org.jxls.util.JxlsHelper.processTemplate(JxlsHelper.java:173)
...

看起来,要么不支持 .XLSX,要么我需要另一个库。

最佳答案

有人给我建议。为了使用 XLSX,还需要一个库:

<!-- https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>ooxml-schemas</artifactId>
    <version>1.3</version>
</dependency>

整个pom看起来像这样:

...<dependencies>
        <!-- slf4j + log4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>

        <!-- XLSTranformer - vyplnovani xlsx sablon -->
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls</artifactId>
            <version>2.4.5</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jxls/jxls-jexcel -->
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-jexcel</artifactId>
            <version>1.0.7</version>
        </dependency>

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

        <!-- https://mvnrepository.com/artifact/org.jxls/jxls-reader -->
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-reader</artifactId>
            <version>2.0.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>ooxml-schemas</artifactId>
            <version>1.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-jexl -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-jexl</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>

    </build>
</project>

生成代码:

公共(public)类 ExcelBuilder { 私有(private)静态最终记录器记录器 = LoggerFactory.getLogger(ExcelBuilder.class);

public static OutputStream generate(String template, Map<String, String> queryParams, String recordName,
        List<?> records) {
    try (InputStream templateInputStream = ExcelBuilder.class.getResourceAsStream(template)) {
        // byte[] result = IOUtils.toByteArray(templateIs);
        try (OutputStream outputStream = new FileOutputStream("protokol.xlsx")) {
            Context context = new Context();
            Entry<String, String> entry = queryParams.entrySet().iterator().next();
            // context.putVar(entry.getKey(), entry.getValue());
            context.putVar(recordName, records);
            JxlsHelper instance = JxlsHelper.getInstance();
            instance.processTemplate(templateInputStream, outputStream, context);
            return outputStream;
        }
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
        return null;
    }
}

}

模板基于模板注释标记,如下所述:Jxls Object Collection Sample

关于java - 我可以在 Jxls 2+ 中的模板和输出格式中使用 .XLSX 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51040342/

相关文章:

java - 对atomicintegerarray的过时引用可能吗?

java - 哪个 ODBC-JDBC 桥将自己的调用映射到 JDBC 驱动程序?

vba - 从图表中删除空系列(使用 VBA)

jxls - 如何在 JXLS 2.3.0 中获取行索引

java - Vaadin UI - 不能为每个客户端使用静态字段

java - List 的每个子项的 add 方法和 get 方法的速度有多快

如果不是交互式的,来自 Microsoft Access VBA 的 mySQL 查询会失败吗?

C#/Excel : Convert Excel Range to Array with Correct Data Type

java - Jxls单细胞形成/单细胞收集

Java - 同步日期格式 - jxls