JQuery 中 AJAX 如何实现 Excel 文件 下载

使用 jQuery.fileDownload.js 插件实现Ajax下载文件 近期的项目里有一个需求,列表查询模块有个导出按钮,功能很简单,用的是form表单把查询参数提交到后台,提交之后前台给导出按钮添加disable,防止用户重复导出,避免导出的数据量很大的时候给服务器带来不必要的负担.后台根据前台传的查询参数执行条件查询,将查询到的结果集生成Excel用response写到前台直接下载. 做完之后测试大佬提了个BUG,由于Ajax请求无法直接下载文件,所以用的是for... 阅读详情

我们知道,JQuery的ajax函数的返回类型只有xml、text、json、html等类型,没有“流”类型,所以我们要实现ajax下载,不能够使用相应的ajax函数进行文件下载。但在js中 生成一个form,用这个form提交参数,并返回“流”类型的数据。在实现过程中,页面也没有进行刷新。

注意,如果服务器端是Spring MVC,则该server端必须支持 post方法且 content type 是 "application/x-www-form-urlencoded"

下面的例子均已调试通过。


前端JS页面例子:

mp.jsp


 manipulationHistory.downloadData = function() {
    	//定义一个form表单
    	var myform = $("<form></form>");
    	myform.attr('method','post')
    	myform.attr('action',"/manipulationHistory/exportManipulationInfo");
    	
    	var myProductId = $("<input type='hidden' name='productId' />")
    	myProductId.attr('value',$("#query-param-product-id").val());
    	
    	var myPurchaseOrderId = $("<input type='hidden' name='purchaseOrderId' />") 
    	myPurchaseOrderId.attr('value',$("#query-param-dispatched-po").val());
    	
    	var myWarehouseId = $("<input type='hidden' name='warehouseId' />") 
    	myWarehouseId.attr('value', $("#query-param-warehouse-id").val());
    	
    	var myRelatedOrderId = $("<input type='hidden' name='relatedOrderId' />") 
    	myRelatedOrderId.attr('value', $("#query-param-order-id").val());
    	
    	var myUpdateReason = $("<input type='hidden' name='updateReason' />") 
    	myUpdateReason.attr('value', $("#query-param-update-reason").val());
    	
    	var myStartTime = $("<input type='hidden' name='startTime' />") 
    	myStartTime.attr('value', $("#operate-time-start-value").val());
    	
    	var myEndTime = $("<input type='hidden' name='endTime' />") 
    	myEndTime.attr('value', $("#operate-time-end-value").val());
    	
    	myform.append(myProductId);
    	myform.append(myPurchaseOrderId); 
    	myform.append(myWarehouseId); 
    	myform.append(myRelatedOrderId); 
    	myform.append(myUpdateReason); 
    	myform.append(myStartTime); 
    	myform.append(myEndTime);
    	myform.appendTo('body').submit(); //must add this line for higher html spec  	
    };

后台server端的java代码如下(用SPring MVC来支持)

/*
     * Ajax not support stream response message, so front page need to use form
     * to submit request with APPLICATION_FORM_URLENCODED
     */
    @Consumes({ MediaType.APPLICATION_FORM_URLENCODED })
    @RequestMapping(value = "/exportManipulationInfo", method = RequestMethod.POST)
    @ResponseBody
    public boolean exportManipulationInfo(HttpServletRequest request, HttpServletResponse response) {
        ManipulationInfoQuery manipulationInfoQuery = generateMHQuery(request);
        LOG.info("[IMS_INFO][exportManipulationInfo] received request: " + JsonHelper.toJson(manipulationInfoQuery));
        List<ManipulationInfo> resultList = manipulationHistoryPageService.getManipulationInfoListWithoutPage(manipulationInfoQuery);
        if (null == resultList || resultList.isEmpty()) {
            LOG.info(" no data retrieved for query: " + JsonHelper.toJson(manipulationInfoQuery));
        }
        return downLoadsExcel(resultList, response);
    }

    private ManipulationInfoQuery generateMHQuery(HttpServletRequest request) {
        ManipulationInfoQuery resultQuery = new ManipulationInfoQuery();
        resultQuery.setProductId(request.getParameter("productId"));
        resultQuery.setPurchaseOrderId(request.getParameter("purchaseOrderId"));
        String warehouseID = request.getParameter("warehouseId");
        if (StringUtils.isNotBlank(warehouseID)) {
            resultQuery.setWarehouseId(Integer.parseInt(warehouseID));
        } else {
            resultQuery.setWarehouseId(null);
        }
        resultQuery.setRelatedOrderId(request.getParameter("relatedOrderId"));
        resultQuery.setUpdateReason(request.getParameter("updateReason"));
        resultQuery.setStartTime(request.getParameter("startTime"));
        resultQuery.setEndTime(request.getParameter("endTime"));
        resultQuery.setPageInd(null);
        resultQuery.setPageSize(null);
        return resultQuery;
    }

    private boolean downLoadsExcel(List<ManipulationInfo> dataList, HttpServletResponse response) {
        FileOutputStream fos = null;
        try {
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet("ManipulationInfo_details");
            sheet.setDefaultColumnWidth(40);

            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HSSFCellStyle.ALIGN_LEFT);

            String fileName = "ManipulationInfoData-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
            fos = new FileOutputStream(fileName);

            // column name
            String[] label = { "index", "productId", "productName", "warehouseId", "warehouseName", "dispatchedPo", "relatedOrderId", "updateField", "action",
                    "result", "updateReason", "operator", "operateTime" };

            int columnNum = label.length;
            // set title column at line 0
            HSSFRow titleRow = sheet.createRow((int) 0);
            // the most left column is index of column
            HSSFCell titleCell = null;
            for (int n = 0; n < columnNum; n++) {
                titleCell = titleRow.createCell(n);
                titleCell.setCellType(HSSFCell.CELL_TYPE_STRING);
                titleCell.setCellValue(label[n]);
                titleCell.setCellStyle(style);
            }

            if (null != dataList && !dataList.isEmpty()) {
                for (int rowIndex = 0; rowIndex < dataList.size(); rowIndex++) {
                    ManipulationInfo item = dataList.get(rowIndex);
                    /*
                     * the line 0 is title line,so actual data line begins from
                     * the next one line.
                     */
                    HSSFRow row = sheet.createRow(rowIndex + 1);
                    String rowData[] = { item.getProductId(), item.getProductName(), item.getWarehouseId().toString(), item.getWarehouseName(),
                            item.getDispatchedPo(), item.getRelatedOrderId(), item.getUpdateField(), item.getAction(), item.getResult().toString(),
                            item.getUpdateReason(), item.getOperator(), item.getOperateTime() };

                    // create the most left column as index column
                    HSSFCell cell = row.createCell(0, HSSFCell.CELL_TYPE_NUMERIC);
                    cell.setCellValue(rowIndex + 1);
                    cell.setCellStyle(style);

                    // create the remaining cells at the same line
                    for (int columnIndex = 1; columnIndex < columnNum; columnIndex++) {
                        cell = row.createCell(columnIndex, HSSFCell.CELL_TYPE_STRING);
                        cell.setCellValue(rowData[columnIndex - 1]);
                        cell.setCellStyle(style);
                    }
                }
            } else {
                LOG.info(" no data retrieved");
            }

            // set all columns to automatically adjust column width
            for (int i = 0; i < columnNum; i++) {
                sheet.autoSizeColumn(i);
            }

            wb.write(fos); // write workbook into file .xls
            fos.flush(); // flush buffer to file
            fos.close(); // remember to close it
            if (wb != null) {
                response.reset();
                response.setContentType("application/vnd.ms-excel");
                response.setHeader("Content-Disposition", "filename=" + new String(fileName.getBytes(), "iso-8859-1"));
                OutputStream out = response.getOutputStream();
                wb.write(out);
                out.flush();
                out.close();
            }
        } catch (Exception e) {
            LOG.error( downLoadsExcel exception:" + e);
            return false;
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    LOG.error(" close FileOutputStream error:" + e);
                    return false;
                }
            }
        }

        return true;
    }

在上面的JAVA后端代码中,注意没有@RequestBody来修饰传入参数,这是因为如下说明:

关于@ResponseBody,@RequestBody,@PathVariable比较通俗的解释就是:
@PathVariable主要是用来处理URl路径的问题,利用@PathVariable可以是实现在URL路径中实现参数的隐藏效果。
@RequestBody主要是用来处理请求类型转换问题,例如可以把json字符串通过配置自动转换为对象之类的。
@ResponseBody主要是用来处理返回类型转换问题,例如可以把json字符串通过配置自动转换为对象之类的。
一般@ResponseBody,@RequestBody都是用来处理json和xml数据类型,不能用于传统的html解析,因为@ResponseBody,@RequestBody都只是获取内容而已,并不是整个html,所以在有用到json或者xml数据类型传输的时候才可以考虑使用@ResponseBody,@RequestBody这两个注解,否则不要使用。


一个不错的连接是:

http://blog.youkuaiyun.com/linzhiqiang0316/article/details/52328153


SpringBoot 普通文件下载 + 前端获取后端返回的文件流并下载 ⏹SpringBoot 普通文件下载 + 前端获取后端返回的文件流并下载 阅读详情

相关推荐

DownloadExcel:用于将 html 表下载为 excel .xls 格式的 jquery 插件

下载Excel 用于将 html 表下载为 excel .xls 格式的 jquery 插件 $('table').downloadExcel() 使用表格内容创建 xls 文件并强制下载。 您可以在点击事件上启动它。 $('#downloadBtn').click(function(){ $('table').downloadExcel('你的文件名') })

ajax请求二进制流下载文件

转自 :https://www.jb51.net/article/122797.htm 原理:通过a标签来下载文件 代码实现 function download() { var url = 'download/?filename=aaa.txt'; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以...

qq_38000851的博客 1561

向NCBI上传16S rDNA数据的操作详解

专门介绍向NCBI上传16S rDNA数据的方法不太多。因为自己有上传数据的需要,所以决定边摸索边写下操作流程。如果这篇博文交代了上传步骤以及一些描述文件属性的书写,帮到你的话,还请点赞收藏。

yue81560的博客 2万+

ajax jquery 下载流文件

ajax jquery 下载流文件

qq_43901960的博客 2550

瑞芯微RK3588开发板VSCode远程开发全攻略:从SSH配置到插件优化

本文详细介绍了如何在瑞芯微RK3588开发板上配置VSCode远程开发环境。从Ubuntu系统下的SSH服务设置、VSCode Remote-SSH扩展安装,到连接建立、基础工具链部署,再到针对ARM平台的性能优化与调试配置,提供了一套完整的实战指南,帮助开发者高效利用本地资源进行嵌入式开发。

weixin_28831341的博客 621

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

jq导入导出excel

这里拿到数据处理成自己想要的格式就可以。

Z_Gleng的博客 2050

手把手教你搭建日本亚马逊CVV钓鱼系统(含自动验证功能)

本文详细介绍了电商平台安全防护的关键实践,重点讲解了如何构建自动化风控系统。内容包括基础架构设计、用户行为分析、交易风险评估模型构建、验证机制实现以及系统部署优化,帮助电商平台有效识别和防范安全威胁,同时提升用户体验。

weixin_30952535的博客 815

运用JQuery的AJAX实现excel文件下载

刚刚毕业,现在在公司做一个关于网关api的项目。做关于excel文件的导入和导出功能的实现,运用spring框架和jquery实现了文件的下载功能。  前端代码:下载模板 js文件代码:  //JQuery的AJAX实现文件下载      $scope.download = function() {     console.log('enter download ');  

qq_39801765的博客 6811

AUTOSAR R20-11标准下载!

这是公众号的第2篇推文,粉丝数49 Document Search Classic Platform Adaptive Platform Foundation 文档截图 以为会在明天的发布会之后才上线,没想到官网现在就悄悄放出来了。 中国由于网络问题,下载速度比较慢或者会中断。 “阅读原文”提供多种下载方式,可以在线浏览,可以集中下载也可单个文档下载。 如有增减我也会及时在公众号里通知大家,不过我觉得不会变动了。 整理不宜,好东西要分...

Adaptive_AUTOSAR的博客 1890

ESP32-S3驱动雨滴传感器实战:从原理到ADC/GPIO双模式数据采集

本文详细介绍了ESP32-S3驱动雨滴传感器的实战教程,涵盖其工作原理及ADC/GPIO双模式数据采集方法。通过解析传感器利用水的导电性检测雨量的核心机制,提供了完整的硬件连接方案与软件驱动代码,包括模拟量(AO)的ADC读取和数字量(DO)的GPIO读取,并附有调试技巧,帮助开发者快速实现雨滴检测功能。

weixin_32005771的博客 154

NetCore Jquery 使用 AJAX POST 方式下载 Excel 文件二

注意:jquery版本3.0以上,否则可能导致下载打不开或者没有xhrFields属性。经过测试,下载excel文件可正常打开。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 9万+

Stable Diffusion WebUI 安装前准备

大家好,我是水滴~~在安装 stable-diffusion-webui 前需要做一些准备工作,本篇文章主要介绍需要的电脑配置、魔法、安装 Python、安装 Git 等。

水滴的博客 2100

$.ajax下载流文件

<body> <div class="wrap"> <div> <p>agent_id:</p> <input type="text" value="" id="agentId"> <p>token:</p> <input type="text" value="" id="token"> </div> <a href="javascri

xjf106的博客 2429

YOLOv11在STM32H7上的MCU部署实战:基于CMSIS-NN的高效推理实现

嵌入式AI与MCU部署技术解析 本文系统介绍了基于STM32H7微控制器的YOLOv11模型部署方案。主要内容包括: 边缘计算背景下MCU的AI部署优势与挑战,重点分析了STM32H7平台特性 YOLOv11模型的结构优化,包括E-ELAN骨干网络和Meta-ACON激活函数等改进 CMSIS-NN加速库的架构原理,在STM32H743上可实现5.4倍卷积加速 完整的开发环境搭建流程,涵盖硬件选型、工具链配置和模型转换 模型优化关键技术,包括int8量化、剪枝和内存占用优化等 实验表明,该方案在保持模型精度

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 853

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基于前端jquery ajax和后端ssm框架下的导出excel表格的实现

     最近需要使用jquery 的ajax实现了excel表格的功能,首选,我想说的是,jquery的ajax只是看起来让你以为是通过ajax下载了一个excel表格,但是,这个只是一个假象,这个只是一个假象,这个只是一个假象。重要的事情说三遍!!!    实际原理是利用ajax返回一个需要下载的excel的文件名而已,在ssm框架的service层,帮我们把需要的excel通过流的方式下载到...

qq_34309663的博客 7419

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

动态提交使用jQuery 完成ajax 文件下载

查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的:Ajax 文件下载:jQuery.download = function(url, data, method){ // 获得url和data if( url && data ){ // data 是 string 或者 array/object data = typeof data

软件研发实战应用技术分享 805

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

前端 jquery ajax js 导出excel_记录

前端 jquery ajax js 导出excel 按钮代码 <button type="button" id="excelBtn" class="layui-btn layui-btn-normal" data-type="reload">导出Excel</button> 前端数据处理 //导出按钮绑定事件 $("#excelBtn").on("click", function(){ var JSON_DATA = { "title":[

weixin_41592847的博客 1081

php通过ajax下载文件,PHP使用ajax的post方式下载excel文件简单示例

本文实例讲述了PHP使用ajax的post方式下载excel文件。分享给大家供大家参考,具体如下:项目需求,前端发起ajax请求,后端生成excel并下载,同时需要在header头中,带上token验证信息,参考了很多文章,最终实现如下:PHP后端使用base64:$filename = 'demo.xlsx';$objWriter = \PHPExcel_IOFactory::createWri...

weixin_39530839的博客 233

jQuery实现文件下载( 隐藏表单实现ajax下载 )

原因是Sigma表格控件要实现Excel导出表格中的数据 , 用$.Ajax()实现不了,  所以暂时用了个折中的办法 ,   项目里类似情况后边可能还很多 , 记录一下, 以后有更好的办法再来改进吧 链接可以实现下载 , $.Ajax不行: 导出Excel 实现功能的JS代码: Sigma.ToolFactroy.register( 'xl

徐行 5511

js下载后台返回的excel文件流

注意:用jQuery ajax - ajax() 方法是获取不到请求成功的数据的。 var xhr= new XMLHttpRequest(); xhr.open("GET", "<你的返回流的Action路径>", true); xhr.responseType = "blob"; xhr...

jimjiayu 4936

ajax 请求返回excel,建议使用jQuery的AJAX返回一个excel文件

我有一个网页,有一堆领域,并得到EXCEL按钮。目前,当用户按下GET EXCEL按钮,JS脚本收集来自字段中的数据,炮制一个URL的动作控制器:建议使用jQuery的AJAX返回一个excel文件 在JS:$("excel-btn").onclick(function() {//get selected parameters:p1 = $("#p1").val();p2 = $("#p2").v...

weixin_39707693的博客 917

jquery中pdf的上传、下载及excel导出

jquery中pdf的上传、下载及excel导出

joan_yb的博客 1910

JQuery 模拟发送请求,用于下载文件传参

JQuery 模拟发送请求,用于下载文件传参 因为ajax不支持下载文件请求 一种直接请求下载地址,使用?和&amp;amp;符号拼接参数 一种使用js模拟传参 function excel() { var url = &quot;${ctx}/excel/statistic.do&quot;; var form = $(&quot;&amp;lt;form&amp;gt;&amp;lt;/form&a

千里之行,始于足下 1728

TP框架使用ajax的post请求方式下载文件

详细流程不展示了 直接展示 最后下载的 //主要流程 //主要流程 //主要流程 //主要流程 //把文件转成文件流的形式 ob_start(); $xlsData = ob_get_contents(); ob_end_clean(); $data = [ 'file' => "data:application/vnd.ms-excel;base64," . base64_encode($xlsData),

栈外手记|2018 年起深耕后端开发。跳出代码栈,分享技术、项目踩坑与行业思考,看见技术之外更多可能。 1225
上一篇: springmvc 中使用poi导出excel
下一篇: 表单 (form) JSP ajax http 请求和响应格式
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值