com.alibaba.excel.exception.ExcelGenerateException: Create workbook failure

Execel生成异常:创建工作簿失败

场景1

我的bug产生场景1:使用EasyExcel作导出的时候,抛出的这个异常。我导入的是xls后缀的文件

导出部分代码:

    public void htDrXz(HttpServletResponse response) {
        log.info("----------导入模板下载----------");
        ClassPathResource resource = new ClassPathResource("/static/导入明细表.xlsx");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + "导入明细表.xlsx");
        try {
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate((resource.getInputStream())).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            excelWriter.fill(new ArrayList<FpJgBcDaoRuNew>(), writeSheet);
            excelWriter.finish();
        } catch (Exception e) {
            log.error("导入模板下载异常", e);
        }
    }

解决方法

将Excel文件,另存为xlsx后缀的文件。(注意:不要直接将xls后缀改为xlsx后缀,要另存为)
产生原因:估计是版本兼容问题

场景2

还有一种另存为依然报错的情况,最好在导出的时候,声明Excel的文件类型(ExcelTypeEnum.XLS或者ExcelTypeEnum.XLSX),因为EasyExcel默认是xlsx格式,导出xls不去声明类型,依然会报错Create workbook failure

具体声明位置和方法:

            ExcelWriter excelWriter = EasyExcelFactory.write(response.getOutputStream())
                    .withTemplate(resource.getInputStream()).excelType(ExcelTypeEnum.XLS).build();
### 如何在Spring Boot项目中使用EasyExcel动态生成表头 在Spring Boot项目中集成并使用EasyExcel实现动态生成表头的功能,可以通过自定义`Head`属性来完成。以下是详细的说明: #### 动态生成表头的核心概念 EasyExcel 提供了灵活的方式来处理 Excel 文件中的表头部分。通过设置 `List<List<String>> head` 属性,可以轻松实现动态生成表头的需求[^1]。 #### 实现方式 为了支持动态生成表头,可以在编写代码时将表头作为参数传入,并将其赋值给 `head` 字段。下面是一个完整的示例代码展示如何实现这一功能: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.metadata.WriteSheet; import java.util.ArrayList; import java.util.List; public class DynamicHeaderExample { public static void main(String[] args) { // 定义文件路径 String fileName = "dynamic_header_example.xlsx"; // 动态生成的表头 List<List<String>> dynamicHeaders = new ArrayList<>(); dynamicHeaders.add(List.of("姓名", "年龄", "性别")); // 如果需要更多列,可以直接扩展该列表 dynamicHeaders.add(List.of("地址")); // 数据源 (模拟数据) List<UserData> data = new ArrayList<>(); data.add(new UserData("张三", 25, "男", "北京")); data.add(new UserData("李四", 30, "女", "上海")); // 写入 Excel 文件 EasyExcel.write(fileName).head(dynamicHeaders).sheet("动态表头示例").doWrite(data); } // 数据模型类 public static class UserData { private String name; private Integer age; private String gender; private String address; public UserData() {} public UserData(String name, Integer age, String gender, String address) { this.name = name; this.age = age; this.gender = gender; this.address = address; } // Getters and Setters 方法省略... } } ``` 上述代码展示了如何通过传递一个二维字符串列表 (`List<List<String>>`) 来动态指定表头内容。这种设计允许开发者根据实际需求调整表头结构[^2]。 #### 处理大文件场景下的优化建议 当面对大数据量的情况时,推荐采用分页或分批次的方式进行写入操作,从而减少内存占用。这可以通过 EasyExcel 的监听器机制实现[^3]。 #### 常见异常及其解决方法 在开发过程中可能会遇到一些常见问题,例如 `com.alibaba.excel.exception.ExcelGenerateException: Create workbook failure`。这类错误通常是由模板文件损坏或者依赖版本不匹配引起的。确保使用的 EasyExcel 版本与 Spring Boot 版本兼容是非常重要的[^4]。 #### 浏览器端导出功能 如果希望提供浏览器端直接下载的功能,则需额外配置 HTTP 响应头信息以及输出流管理逻辑。具体实现如下所示[^5]: ```java import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.net.URLEncoder; public void exportToBrowser(HttpServletResponse response) throws Exception { // 设置响应头 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 编码文件名以防止中文乱码 String fileName = URLEncoder.encode("测试文件", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); try ( OutputStream outputStream = response.getOutputStream(); ExcelWriter excelWriter = EasyExcel.write(outputStream).build() ) { WriteSheet writeSheet = EasyExcel.writerSheet(0, "动态表头示例").build(); // 构建动态头部 List<List<String>> headers = new ArrayList<>(); headers.add(List.of("字段A", "字段B", "字段C")); // 模拟数据集 List<Object[]> dataList = new ArrayList<>(); dataList.add(new Object[]{"值1-A", "值1-B", "值1-C"}); dataList.add(new Object[]{"值2-A", "值2-B", "值2-C"}); // 执行写入动作 excelWriter.write(dataList.stream().map(row -> row), writeSheet); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } ``` 以上代码片段实现了基于 Web 请求触发的 Excel 文件导出流程。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值