javascript 使用 AJAX 调用下载文件

flseospp  于 2023-01-24  发布在  Java
关注(0)|答案(5)|浏览(401)

我正在使用PHPExel读取excel模板,填充数据,并要求用户下载文件。
generate_excel.php

$objPHPExcel = PHPExcel_IOFactory::load("./template.xlsx");
//populate data ...
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="01simple.xlsx"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');

当我直接从浏览器打开generate_excel. php时,结果文件被下载。但是如果我对generate_excel. php进行ajax调用,我就不会得到下载提示。使用chrome开发工具,我可以从Network选项卡看到ajax调用成功完成,并且在响应数据中看到一堆随机字符。我假设这是excel对象。
有人知道我如何使用ajax实现下载excel的功能吗?我不想刷新页面,当用户点击"导出"按钮时,应该会有一个ajax调用php文件并提示用户下载。
谢谢!

dxpyg8gm

dxpyg8gm1#

我想用 AJAX 把JSON数据传递给PHP,然后返回一个excel文件(MySQL和PHPExel)让用户保存。我四处看了看,把一些碎片放在一起,希望它能帮助到别人:
jQuery:

$("#exportBotton").on("click",function(event) {
event.preventDefault();
// create json object;
str_json = JSON.stringify({"key01":val01, "key02":val02, "key03":val03});
        $.ajax({
              type: "post",
              data: str_json,
              url: "../../includes/dbSelect_agentFormExport.php",
              dataType: "json",
              success: function(output){
                          // output returned value from PHP t
              document.location.href =(output.url);
            }
       });
});

PHP语言:

$str_json = file_get_contents('php://input');
 $objPHPExcel = new PHPExcel();
 // here i populated objPHPExcel with mysql query result.....

 function saveExcelToLocalFile($objWriter){
    // make sure you have permission to write to directory
    $filePath = '../tmp/saved_File.xlsx';
    $objWriter->save($filePath);
    return $filePath;
}

 $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
 $response = array(
     'success' => true,
     'url' => saveExcelToLocalFile($objWriter)
 );
 echo json_encode($response);
 exit();
jaql4c8m

jaql4c8m2#

不是所有的事情都应该用 AJAX 来做。有时候普通的HTML更适合一份工作。我猜你的按钮有a标签?为什么你不做这样的事情呢

<a href="generate_excel.php" target="_blank">Export to Excel</a>

注意target="_blank"部分。它的作用是确保页面不会被重新加载。
对于input,可以使用construct

<form action="generate_excel.php" target="_blank"><input type="button">...whatever</form>
htrmnn0y

htrmnn0y3#

下面是如何使用 AJAX 调用下载文件的示例:

var xhr = new XMLHttpRequest();
xhr.open("GET", "path/to/file.ext", true);
xhr.responseType = "blob";
xhr.onload = function(e) {
   if (xhr.status === 200) {
      var a = document.createElement("a");
      a.href = URL.createObjectURL(xhr.response);
      a.download = "file.ext";
      a.style.display = "none";
      document.body.appendChild(a);
      a.click();
   }
};
xhr.send();
xe55xuns

xe55xuns4#

找到了一种方法来做到这一点,虽然我不确定这是否是一个理想的方法。
我在页面中添加了一个隐藏的iframe,当 AJAX 调用返回时,它会返回创建数据的url,我使用javascript将iframe重定向到那个url,它会自动触发下载动作。

ubbxdtey

ubbxdtey5#

您可以尝试以下方法:
1.发送一个Jquery AJAX POST请求,其中包含用于生成excel报告的数据,并将该数据存储在一个会话变量中。返回一个任意字符串(如“success”)作为响应。
1.如果上述 AJAX 调用的输出为“success”,则对应用程序中的另一个URL执行GET请求,该请求从会话读取数据(在第一步中存储,否则抛出错误),从该数据准备excel文件,并强制将该excel文件下载到浏览器。

相关问题