alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.02k stars 7.49k forks source link

3.3.0版本导出数据失败 #3174

Closed changdy closed 1 year ago

changdy commented 1 year ago

前两天发布最新版本后 今天已经开始尝试 ,发现导出失败 ,堆栈信息如下:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoClassDefFoundError: com/alibaba/excel/support/util/CollectionUtils
    at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:42)
    at com.alibaba.excel.ExcelWriter.<init>(ExcelWriter.java:39)
    at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:133)
    at DemoExport.main(DemoExport.java:11)
Caused by: java.lang.NoClassDefFoundError: com/alibaba/excel/support/util/CollectionUtils
    at com.alibaba.excel.util.ClassUtils.doDeclaredFields(ClassUtils.java:327)
    at com.alibaba.excel.util.ClassUtils.lambda$declaredFields$6(ClassUtils.java:286)
    at java.util.HashMap.computeIfAbsent(HashMap.java:1127)
    at com.alibaba.excel.util.ClassUtils.declaredFields(ClassUtils.java:285)
    at com.alibaba.excel.metadata.property.ExcelHeadProperty.initColumnProperties(ExcelHeadProperty.java:109)
    at com.alibaba.excel.metadata.property.ExcelHeadProperty.<init>(ExcelHeadProperty.java:77)
    at com.alibaba.excel.write.property.ExcelWriteHeadProperty.<init>(ExcelWriteHeadProperty.java:49)
    at com.alibaba.excel.write.metadata.holder.AbstractWriteHolder.<init>(AbstractWriteHolder.java:222)
    at com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder.<init>(WriteWorkbookHolder.java:168)
    at com.alibaba.excel.context.WriteContextImpl.initCurrentWorkbookHolder(WriteContextImpl.java:107)
    at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:90)
    at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:36)
    ... 3 more
Caused by: java.lang.ClassNotFoundException: com.alibaba.excel.support.util.CollectionUtils
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 15 more

Process finished with exit code 1

java代码如下:


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.converters.date.DateStringConverter;

import java.io.File;
import java.io.IOException;
import java.util.Date;

public class DemoExport {
    public static void main(String[] args) throws IOException {
        File tempFile = File.createTempFile("demo", "test.xls");
        ExcelWriter build = EasyExcel.write(tempFile, DemoRecord.class).build();
    }

    public static class DemoRecord {
        @ExcelProperty("订单编号")
        private String orderNumber;
        @ExcelProperty(value = "下单时间", converter = DateStringConverter.class)
        @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
        private Date createdDate;
    }
}

为了排除依赖,我是新建一个maven项目进行测试 ,依赖仅有easyexcel

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>export-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.3.0</version>
<!--            <version>3.2.1</version>-->
<!--            3.2.1版本能够正常运行-->
        </dependency>
    </dependencies>

</project>

感谢菊苣的付出 . 比心

roushanyyzz commented 1 year ago

我也遇到这个问题了:(

changdy commented 1 year ago

我也遇到这个问题了:(

已经群里@大佬了,估计很快就能解决了

roushanyyzz commented 1 year ago

我也遇到这个问题了:(

已经群里@大佬了,估计很快就能解决了

感谢,刚好公司新开项目,说尝试下最新的版本,现在还是先用3.2.1

heyzqq commented 1 year ago

看到你提的问题 #2697,刚好升级试一下试试 orderByIncludeColumn,直接报错了,比较急,还是回退了

changdy commented 1 year ago

看到你提的问题 #2697,刚好升级试一下试试 orderByIncludeColumn,直接报错了,比较急,还是回退了

嗯 估计很快修复 . 当时我还以为是我 依赖有问题.

changdy commented 1 year ago

看到你提的问题 #2697,刚好升级试一下试试 orderByIncludeColumn,直接报错了,比较急,还是回退了

我也遇到这个问题了:(

昨天已经发布了 新版本 .

heyzqq commented 1 year ago

看到你提的问题 #2697,刚好升级试一下试试 orderByIncludeColumn,直接报错了,比较急,还是回退了

我也遇到这个问题了:(

昨天已经发布了 新版本 .

没有报错了,但是没有导出指定列,这么写有什么问题吗:

// 第一行指定了表头 AddressImportVO.class
EasyExcel.write(response.getOutputStream(), AddressImportVO.class)
        .autoCloseStream(false)
        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
        .sheet("位置")
        .includeColumnFieldNames(ListUtils.newArrayList("code",
                // "name",
                "remark"))
        .orderByIncludeColumn(true)
        .doWrite(list);
heyzqq commented 1 year ago

看到你提的问题 #2697,刚好升级试一下试试 orderByIncludeColumn,直接报错了,比较急,还是回退了

我也遇到这个问题了:(

昨天已经发布了 新版本 .

没有报错了,但是没有导出指定列,这么写有什么问题吗:

  • 指定了表头 AddressImportVO.class,includeColumnFieldNames 就没有效果了
  • 如果没有指定表头,可以导出指定列,但是没有表头
// 第一行指定了表头 AddressImportVO.class
EasyExcel.write(response.getOutputStream(), AddressImportVO.class)
        .autoCloseStream(false)
        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
        .sheet("位置")
        .includeColumnFieldNames(ListUtils.newArrayList("code",
                // "name",
                "remark"))
        .orderByIncludeColumn(true)
        .doWrite(list);

经过一顿尝试,找到了解决方法:

// 不在这边(write)指定表头了
EasyExcel.write(response.getOutputStream())
        .autoCloseStream(false)
        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
        .sheet("位置")
        //  使用 head 指定表头
        .head(AddressImportVO.class)
        .includeColumnFieldNames(ListUtils.newArrayList("code",
                // "name",
                "remark"))
        .orderByIncludeColumn(true)
        .doWrite(list);

这个是否是 write 方法设置表头方式,遗漏对 includeColumnFieldNames 的支持呢?

changdy commented 1 year ago

看到你提的问题 #2697,刚好升级试一下试试 orderByIncludeColumn,直接报错了,比较急,还是回退了

我也遇到这个问题了:(

昨天已经发布了 新版本 .

没有报错了,但是没有导出指定列,这么写有什么问题吗:

  • 指定了表头 AddressImportVO.class,includeColumnFieldNames 就没有效果了
  • 如果没有指定表头,可以导出指定列,但是没有表头
// 第一行指定了表头 AddressImportVO.class
EasyExcel.write(response.getOutputStream(), AddressImportVO.class)
        .autoCloseStream(false)
        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
        .sheet("位置")
        .includeColumnFieldNames(ListUtils.newArrayList("code",
                // "name",
                "remark"))
        .orderByIncludeColumn(true)
        .doWrite(list);

嗯嗯 早上的时候也发现了 .我是看了下 测试用例 就猜到了. 已经反馈过大佬了.

AmbitionLover commented 1 year ago

com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoClassDefFoundError: com/alibaba/excel/support/util/CollectionUtils at com.alibaba.excel.write.ExcelBuilderImpl.(ExcelBuilderImpl.java:42) at com.alibaba.excel.ExcelWriter.(ExcelWriter.java:39) at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:133) at com.alibaba.excel.write.builder.ExcelWriterBuilder.sheet(ExcelWriterBuilder.java:149) at com.alibaba.excel.write.builder.ExcelWriterBuilder.sheet(ExcelWriterBuilder.java:145)

jdk17 + boot 3.0.6 + easyexcel 3.2.1 or 3.3.1 试了都报错

项目缓存问题 3.3.1 版本不报错了