You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Apache POI生成Excel时,文件名拼接的日期下载后丢失

解决Apache POI生成Excel下载时文件名日期丢失的问题

这种情况我之前也碰到过,控制台能看到完整文件名,但下载后日期莫名消失——核心问题其实不在POI生成文件的逻辑里,而是在HTTP响应头传递文件名给浏览器的环节。控制台打印正常说明你的文件名拼接逻辑是对的,但浏览器解析响应头时出了兼容问题,尤其是当文件名包含20170323这种yyyyMMdd格式的数字串时,容易触发浏览器的异常解析规则。

下面是具体的排查和解决步骤:

1. 对文件名做URL编码并设置兼容的响应头

浏览器对Content-Disposition头里的文件名解析规则差异很大,直接裸传文件名(哪怕是纯数字日期)可能被某些浏览器误截断或忽略。你需要对文件名做URL编码,并针对不同浏览器设置响应头:

// 假设你拼接好的目标文件名(控制台打印正确的那个)
String rawFileName = "业务报表_" + "20170323" + ".xlsx";
// 对文件名做UTF-8编码,处理所有特殊字符和格式兼容问题
String encodedFileName = URLEncoder.encode(rawFileName, "UTF-8");

// 获取浏览器UA,做兼容处理
String userAgent = request.getHeader("User-Agent");
HttpServletResponse response = ...; // 你的响应对象

if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
    // IE/Edge浏览器使用传统编码格式
    response.setHeader("Content-Disposition", "attachment; filename=" + encodedFileName);
} else {
    // Chrome/Firefox等现代浏览器使用RFC 5987标准编码
    response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
}

// 别忘了设置Excel文件的MIME类型
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("UTF-8");

这样处理后,浏览器就能正确解析包含日期的文件名,不会出现丢失或截断的情况。

2. 确认最终传入响应头的文件名是正确的

虽然你控制台打印了正确的文件名,但要确保你打印的是最终传入响应头的那个变量,而不是中间临时变量。有些代码会在写入输出流前,不小心重置响应头或修改文件名变量,建议在设置Content-Disposition的那一行再打印一次文件名,和最初的控制台输出做对比。

3. 排除不可见字符的干扰

有时候日期格式化时可能引入不可见字符(比如换行符、制表符),导致浏览器解析异常。你可以在拼接文件名前对日期字符串做一次trim(),或者打印文件名的字节数组排查:

String dateStr = new SimpleDateFormat("yyyyMMdd").format(new Date()).trim();
String fileName = "业务报表_" + dateStr + ".xlsx";
// 打印字节数组,检查是否有奇怪的非可见字符
System.out.println("文件名字节:" + Arrays.toString(fileName.getBytes(StandardCharsets.UTF_8)));

为什么硬编码1234568正常但20170323不行?

这其实是浏览器解析的玄学兼容问题——某些浏览器会把yyyyMMdd格式的数字串当成潜在的特殊参数或格式标记,从而忽略这部分内容;而无意义的数字串1234568不会触发这个解析逻辑,所以能正常显示。但本质都是响应头编码不规范导致的,用上面的编码方案就能统一解决。

内容的提问来源于stack exchange,提问作者Virat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:54:05