Ajax导出Excel报表实现方法与步骤详解
利用AJAX实现Excel报表导出【解决乱码问题】
在项目开发里,导出Excel报表是个挺常见的需求。但场景一旦复杂起来,常规方法就容易碰壁。比如,接口需要Token认证,直接用A标签就行不通;页面交互复杂,表单提交的方式也不适用。这时候,前端采用AJAX请求、后端返回文件流的方案,就成了一个自然而然的思路。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
背景
具体来说,我们需要前端通过AJAX发起请求,后端设置好相应的响应头(Header),将Excel文件以二进制流的形式返回,再由前端触发浏览器下载。听起来流程清晰,但实际操作时,一个棘手的“乱码”问题却跳了出来。
第一版尝试:jQuery AJAX
主要代码
前端(jQuery AJAX)
var queryParams = {"test":"xxx"};
var url = "xxx";
$.ajax({
type : "POST", //提交方式
url : url,//路径
contentType: "application/json",
data: JSON.stringify(queryParams),
beforeSend: function (request) {
request.setRequestHeader("Authorization", "xxx");
},
success : function(result) {
const blob = new Blob([result], {type:"application/vnd.ms-excel"});
if(blob.size < 1) {
alert('导出失败,导出的内容为空!');
return
}
if(window.na vigator.msSa veOrOpenBlob) {
na vigator.msSa veOrOpenBlob(blob, 'test.xls')
} else {
const aLink = document.createElement('a');
aLink.style.display = 'none';
aLink.href = window.URL.createObjectURL(blob);
aLink.download = 'test.xls';
document.body.appendChild(aLink);
aLink.click();
document.body.removeChild(aLink);
}
}
});
后端(Spring Boot + EasyPOI)
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
@PostMapping(value = "/download")
public void downloadList(@RequestBody Objct obj, HttpServletResponse response) {
......
List excelList = new ArrayList<>();
// excel总体设置
ExportParams exportParams = new ExportParams();
// 指定sheet名字
exportParams.setSheetName("test");
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, Custom.class, excelList);
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("test", "utf-8") + ".xls");
OutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
......
}
测试结果与问题定位
文件倒是能正常触发下载,但打开一看,内容全是乱码。问题出在哪儿?排查方向通常指向这么几个点:
1. 后端响应未正确设置字符编码,或者被Spring的过滤器统一处理了;
2. 前端页面本身的字符集设置有问题;
3. 最关键的一点,需要在AJAX请求中指定 responseType = “arraybuffer”,告诉浏览器期待一个二进制数组缓冲的响应。
经过一番测试,基本可以断定问题就出在第三点。然而,即便在jQuery的AJAX配置里加上了这个参数,乱码依然顽固地存在,问题并未解决。
第二版方案:原生AJAX
主要代码
既然jQuery的路子暂时走不通,那就回归本源,试试原生AJAX。后端代码保持不变。
var xhr = new XMLHttpRequest();
xhr.responseType = "arraybuffer";
xhr.open("POST", url, true);
xhr.onload = function () {
const blob = new Blob([this.response], {type:"application/vnd.ms-excel"});
if(blob.size < 1) {
alert('导出失败,导出的内容为空!');
return;
}
if(window.na vigator.msSa veOrOpenBlob) {
na vigator.msSa veOrOpenBlob(blob, 'test.xls')
} else {
const aLink = document.createElement('a');
aLink.style.display = 'none';
aLink.href = window.URL.createObjectURL(blob);
aLink.download = 'test.xls';
document.body.appendChild(aLink);
aLink.click();
document.body.removeChild(aLink);
return;
}
}
xhr.setRequestHeader("Authorization", "xxx");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(queryParams));
测试结果
切换为原生AJAX并明确设置 xhr.responseType = "arraybuffer" 后,再次导出。这次下载的Excel文件打开清爽,乱码问题迎刃而解。
总结
问题的根源就在于对二进制流数据的处理方式上。设置 responseType 为 “arraybuffer” 是关键一步,它能确保浏览器正确解析后端返回的Excel文件流。从实践来看,这个参数在原生XMLHttpRequest中效果明确,直接生效。而在jQuery的AJAX方法中,由于封装层次的原因,相关配置可能未能完全生效,这也是一个需要注意的兼容性细节。希望这个踩坑经历和解决方案,能帮你顺利搞定AJAX导出Excel时的乱码难题。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Java输出方法详解:控制台日志与文件写入全解析
排查问题或了解运行环境时,使用System getProperty()方法可快速获取JVM和操作系统的关键信息。代码能输出Java版本、安装目录、类路径、操作系统详情及文件分隔符等属性。这些信息有助于排查类路径问题、判断环境兼容性、构建跨平台路径,并为日志调试提供重要上下文,是诊断环境问题的实用工具。
Ubuntu系统下使用Go语言实现机器学习的实践指南
在Ubuntu上使用Go进行机器学习需先安装环境并配置工作空间,通过goget获取golearn等库。编写代码遵循数据加载、模型训练、预测评估的流程后运行程序。Go在性能与并发方面有优势,但生态不如Python丰富,更适合特定工程场景或统一技术栈的团队探索。
Ubuntu系统下Go语言程序打包方法与核心要点
在Ubuntu中打包Go应用需关注环境配置、交叉编译与优化。通过GoModules管理依赖,使用CGO_ENABLED=0生成静态二进制文件以实现跨平台兼容。利用UPX和链接器参数减小体积,采用Docker多阶段构建制作最小镜像。交付时建议包含平台信息并签名,注意解决动态库依赖和版本锁定等常见问题。
Android开发中高效管理多个CheckBox组件的实用技巧
在Android应用开发过程中,高效管理多个功能相似的复选框(CheckBox)是提升开发效率的关键。无论是应用设置界面、多选列表,还是动态生成的选项列表,如果对每个CheckBox都进行单独引用和操作,代码会迅速变得冗长且难以维护。那么,是否存在更优雅的解决方案?答案是肯定的——通过数组或动态集合
面向对象编程中封装字段如何提升代码安全性与维护性
将类的公共字段改为私有,并提供公共的获取和设置方法,是提升代码安全性与可控性的基础重构。此举能防止外部随意读写,避免状态失控,并便于后续加入校验、脱敏等控制逻辑,适用于核心业务或敏感字段。
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

