当前位置:

首页 > 编程开发 > ajax实现excel报表导出

ajax实现excel报表导出

利用AJAX实现Excel报表导出【解决乱码问题】 在项目开发里,导出Excel报表是个挺常见的需求。但场景一旦复杂起来,常规方法就容易碰壁。比如,接口需要Token认证,直接用A标签就行不通;页面交互复杂,表单提交的方式也不适用。这时候,前端采用AJAX请求、后端返回文件流的方案,就成了一个自然而

利用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时的乱码难题。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
IE浏览器怀旧版在线网址
IE浏览器怀旧版在线网址

IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

Spring MVC+ajax进行信息验证的方法
Spring MVC+ajax进行信息验证的方法

采用AJAX与SpringMVC的异步验证,通过XMLHttpRequest对象实现局部数据交换,利用@ResponseBody返回JSON或字符串,结合@RequestBody解析请求体,完成表单无刷新校验,包括用户名重复检测与密码一致性验证。该方法提升交互效率,减少带宽占用,有效确保数据准确性,提升用户体验。

PHP - AJAX 与 PHP
PHP - AJAX 与 PHP

AJAX使网页无需整体刷新即可与服务器交换数据并局部更新,实现无刷新体验。通过PHP实例,用户在输入框键入字符时,JavaScript创建XMLHttpRequest对象向PHP文件发送请求,服务器查找匹配姓名并返回结果,实现实时提示。跨域请求需采用JSONP或CORS解决方案。

如何防止 AJAX 请求缓存导致动态内容无法实时更新
如何防止 AJAX 请求缓存导致动态内容无法实时更新

使用jQuery的.load()方法定时刷新页面时,浏览器或服务器缓存可能导致动态内容无法实时更新。通过为每次请求附加毫秒级时间戳参数,可强制URL变化绕过缓存。需注意时间戳参数必须置于片段选择器之前,且服务端响应头不应设置长时间缓存。

如何在不使用表单输入字段的情况下通过 Ajax 将视图数据发送到控制器
如何在不使用表单输入字段的情况下通过 Ajax 将视图数据发送到控制器

本方法采用JavaScript动态读取DOM元素中的文本、图片路径等非表单内容,通过Ajax(如fetch或jQuery)构造键值对对象,以POST请求发送至后端控制器,经校验后存入数据库,实现无需表单控件的数据传递与存储,适用于动态网页数据异步提交。

Ajax Live Edit 返回 500 内部服务器错误的完整排查与修复指南
Ajax Live Edit 返回 500 内部服务器错误的完整排查与修复指南

在Laravel开发中,Ajax实时编辑出现500错误,主要原因包括:PHP数组多维嵌套、CSRF令牌缺失、控制器未返回JSON。修复方法:需要将数组改为一维关联,从meta标签读取令牌,控制器统一使用response()->json()方法返回,并加强输入验证与异常捕获,以彻底解决。

如何正确处理 AJAX 提交后的 PHP 响应页面跳转问题
如何正确处理 AJAX 提交后的 PHP 响应页面跳转问题

AJAX 本身用于异步请求且不刷新页面,若需在提交数据后跳转并显示 PHP 处理结果,不应混合使用 $.ajax 和 window.open,而应改用表单 POST 提交或在 AJAX 成功回调中动态渲染响应内容。 很多开发者都遇到过这个典型的“断层”问题:前端明明通过 AJAX 把数据成功提交给了

Ajax验证用户名是否存在的实例代码
Ajax验证用户名是否存在的实例代码

Ajax验证用户名是否存在的实例代码详解 在日常的Web项目开发中,注册功能里的用户名查重,几乎是每个新手必做的练习。这不,为了让大家对Ajax实现实时验证的流程有个透彻的理解,今天咱们就来拆解一个非常典型的例子,看看从前端页面、Ja vaScript逻辑,到后台Servlet、Service层,乃

springmvc 结合ajax批量新增的实现方法
springmvc 结合ajax批量新增的实现方法

需要注意的问题 在实现SpringMVC结合Ajax进行批量新增功能时,有几个常见的“坑”需要提前留意。这些细节如果处理不当,很容易导致功能无法正常运行。具体来说,主要集中在以下几个方面: MVC框架中,如何正确处理前端传递的日期格式字符串。 当使用@ResponseBody注解返回一个自定义对象时

laravel ajax curd 搜索登录判断功能的实现
laravel ajax curd 搜索登录判断功能的实现

Lara vel CRUD实战:整合Ajax与登录态管理的用户管理系统 在Lara vel项目中构建一个功能完整的后台管理系统,CRUD操作是基础,而结合Ajax实现无刷新交互、并妥善管理用户登录状态,则是提升体验与安全性的关键一步。接下来,我们就通过一个用户管理模块的实战案例,逐一拆解这些功能的实

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

Android Studio Windows版
Android Studio Windows版
Windows

Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,