如何在 WordPress 中通过 AJAX 触发 Excel 文件自动下载

心靈之曲

心靈之曲

2026-07-13

872人浏览

原创

如何在 WordPress 中通过 AJAX 触发 Excel 文件自动下载

WordPress 中通过 AJAX 调用 PHP 导出 Excel 时,浏览器(Chrome/Firefox/Edge)因安全策略禁止后台请求触发文件下载,需改用 标签 + blob 方式实现前端驱动的自动下载。

wordpress 中通过 ajax 调用 php 导出 excel 时,浏览器(chrome/firefox/edge)因安全策略禁止后台请求触发文件下载,需改用 `` 标签 + `blob` 方式实现前端驱动的自动下载。

当前代码的核心问题在于:AJAX 是异步 HTTP 请求,其响应内容默认被 JavaScript 接收并丢弃,不会触发浏览器原生的文件下载行为——即使 PHP 正确设置了 Content-Disposition: attachment 头,也无法绕过浏览器的安全限制。

✅ 正确方案:将 Excel 数据以 Blob 形式接收,动态创建 标签并模拟点击完成下载。

✅ 修改步骤(推荐且兼容所有现代浏览器)

1. 保持后端逻辑不变(仅微调)

确保 PHP 函数返回二进制流(无需修改),但移除 exit 前的任何额外输出(如 echo、空格、BOM),否则会导致 Blob 损坏:

unity3d游戏开发之相机切换 中文WORD版
unity3d游戏开发之相机切换 中文WORD版

本文档主要讲述的是unity3d游戏开发之相机切换;希望对大家会有帮助;感兴趣的朋友可以过来看看

下载
function export_data_to_excel() {
    // 验证 nonce(增强安全性,建议添加)
    if (!wp_verify_nonce($_POST['nonce'] ?? '', 'llc_quote_profile_autocomplete_nonce')) {
        wp_die('Invalid nonce');
    }

    $spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();
    $activeWorksheet = $spreadsheet->getActiveSheet();
    $activeWorksheet->setCellValue('A1', 'Hello World !');

    $writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);

    // 关键:清除可能的缓冲输出
    if (ob_get_level()) ob_end_clean();

    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment; filename="hello_world.xlsx"');
    header('Cache-Control: max-age=0');
    header('Pragma: public');
    header('Expires: 0');

    $writer->save('php://output');
    exit;
}
add_action('wp_ajax_export_data_to_excel', 'export_data_to_excel');
add_action('wp_ajax_nopriv_export_data_to_excel', 'export_data_to_excel');

⚠️ 注意:务必确保 functions.php 或其他文件中无 echo、var_dump、UTF-8 BOM 或空白字符位于

2. 前端 JS 替换为 Blob 下载方案

将原来的纯 AJAX 请求改为 fetch(更可控)+ Blob + 动态链接下载:

$('#llc-quote-details').on('click', '#exportExcelAndPDF', function(e) {
    e.preventDefault(); // 阻止默认行为(如有)

    const customersPo = $('#edited-customers-po').val();

    fetch(llcQuoteAutocomplete.ajaxurl, {
        method: 'POST',
        credentials: 'same-origin',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: new URLSearchParams({
            action: 'export_data_to_excel',
            customers_po: customersPo,
            nonce: llcQuoteAutocomplete.nonce,
        }),
    })
    .then(response => {
        if (!response.ok) throw new Error(`HTTP ${response.status}`);
        return response.blob(); // ← 关键:接收为 Blob
    })
    .then(blob => {
        const url = window.URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'hello_world.xlsx';
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(url); // 清理内存
        document.body.removeChild(a);
    })
    .catch(err => {
        console.error('Excel download failed:', err);
        alert('导出失败,请检查网络或重试。');
    });
});

? 为什么原方案失效?

  • Chrome/Firefox/Edge 等现代浏览器明确禁止 XMLHttpRequest / fetch 的响应自动触发下载,这是防止恶意脚本静默下载病毒文件的关键防护机制。
  • $.ajax() 返回的是文本/JSON 响应体,而非原始二进制流;即使设 dataType: 'binary',jQuery 也不原生支持可靠解析 Excel 二进制。

✅ 验证要点(调试必查)

  • 打开浏览器开发者工具 → Network 标签 → 点击导出按钮 → 查看 export_data_to_excel 请求:
    • Status 应为 200
    • Response Headers 必须包含 Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    • Preview/Response 不应显示乱码或错误信息(如 “headers already sent”)
  • 若出现 Failed to execute 'createObjectURL' on 'URL',大概率是 PHP 输出了额外字符(检查 BOM、空行、print_r 等)

? 进阶建议

  • 对大文件,可添加 loading 提示与超时控制;
  • 如需支持 IE11,可用 msSaveOrOpenBlob 回退;
  • 生产环境务必校验用户权限(如 current_user_can())再执行导出。

通过该方案,你不仅能稳定下载 Hello World 表格,后续扩展为导出数据库查询结果、用户列表等复杂数据也完全适用。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

word excel ajax wordpress

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1538

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

1423

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

587

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

1314

7

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

1124

4

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

318

5

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.15

1017

5

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.09.24

916

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何在 Windows 11 上安装 XAMPP
如何在 Windows 11 上安装 XAMPP

共1课时 | 129人学习

第二十三期_前端开发
第二十三期_前端开发

共98课时 | 10.4万人学习