springboot下载Excel模板,Excel表损坏问题

在开发SpringBoot应用中遇到Excel模板下载后提示文件损坏的问题。经过排查,发现原因是maven编译时Excel模板被过滤并替换宏值,导致模板损坏。解决方案是调整maven resource配置,避免在编译时对二进制文件如Excel模板进行过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当前开发一个Excel表模板下载功能,模板读取和模板下载都是么有问题的,但打开Excel表示提示,文件已损坏。现象如下:

 

开始以为是代码问题,但文件下载就那几行代码,应该是不会有问题的,在网上搜寻了一番,问题浮出水面,链接如下:

https://www.jianshu.com/p/9d39745f6ce6

问题根因是在maven编译时Excel模板表就已经被损坏了,下载一个已经被损坏的Excel表肯定是无法打开的。

这里就有新问题了,为啥Excel表在编译后会被损坏,这里就涉及到maven  resource标签的使用。

resource标签介绍如下链接:https://my.oschina.net/anxiaole/blog/1613348

我自己的resource配置如下:

问题就出在第二个resource配置,该配置是说将resource下除了后缀.properties,.sql,.yml意外的文件都进行过滤,进行宏值替换,替换就是filtering标签的功能。

filtering功能

 主要用来替换项

### 如何在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 文件导出流程。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值