当前位置: 首页 > 知识库问答 >
问题:

php中生成了一个excel文件,用ajax怎么接受?

吉岳
2024-04-01

下面是一个生成excel的接口,我直接在浏览器上请求接口,会直接叫我下载一个excel文件。

public function index()    {        $spreadsheet = new Spreadsheet();        $sheet = $spreadsheet->getActiveSheet();        // 设置单元格的值        foreach ($this->tableHeader as $k=>$v){            $chr=chr(65+$k);            $sheet->setCellValue($chr."1", $v);        }        foreach ($this->tableData as $k=>$v){            $vArr=array_values($v);            foreach (array_keys($v) as $k2=>$v2){                $chr2=chr(65+$k2).($k+2);                $sheet->setCellValue($chr2, $vArr[$k2]);            }        }        // 保存Excel文件到临时目录        $writer = new Xlsx($spreadsheet);        $tempFilename = tempnam(sys_get_temp_dir(), $this->fileName);        $writer->save($tempFilename);        // 设置HTTP头信息,提供文件下载        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');        header("Content-Disposition: attachment;filename=$this->fileName.xlsx");        header('Cache-Control: max-age=0');        // 读取临时文件并输出到浏览器        $file = fopen($tempFilename, 'rb');        fpassthru($file);        fclose($file);        // 删除临时文件        unlink($tempFilename);    }

但是我现在需要用ajax接受这个文件然后再下载。但是下面的一直提示:
image.png

$.ajax({            url: "/portal/AdminLog/homeExcel",            type: 'POST',            dataType: 'json',            xhrFields: {                responseType: 'blob' // 设置响应类型为JSON            },            data: {                "startTime":$('input[name="startTime"]').val(),                "endTime":$('input[name="endTime"]').val()            },            success: function (blob, status, xhr) {                console.log("成功")                // 创建一个指向 Blob URL 的链接                var url = window.URL.createObjectURL(blob);                // 创建一个新的 a标签用于下载                var a = document.createElement('a');                a.href = url;                a.download = 'filename.ext'; // 设置下载文件的名称                // 触发下载                document.body.appendChild(a);                a.click();                // 清理                window.URL.revokeObjectURL(url);                document.body.removeChild(a);            },            error: function () {                console.log("失败")            },            complete: function () {                console.log("完成")            }        });

共有2个答案

宇文智敏
2024-04-01
The value is only accessible if the object's 'responseType' is '' or 'text' (was 'blob').
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

把 Content-Type 设成 application/octet-stream

咸承教
2024-04-01

jQuery 版本太老了,v3.x 之前不支持 Blob、ArrayBuffer,居然还在用 1.12。

要么升级,要么别用 $.ajax 而是自己单独写个方法。

 类似资料:
  • 本文向大家介绍使用Ajax生成的Excel文件并下载的实例,包括了使用Ajax生成的Excel文件并下载的实例的使用技巧和注意事项,需要的朋友参考一下 很久沒有寫文章啦,今天分享一個如何在ASP.NET MVC里使用Ajax下載生成文件的方法,以下只是個人心得: 大家都應該知道,在ASP.NET MVC里,如果通過Ajax調用后臺控制器時,可以返回一個JSON對象,但并不能直接返回文件(除非刷新頁

  • php 使用 Browsershot 生成pdf文件 报如下错误怎么处理 [0] ProcessFailedException in Browsershot.php line 752 The command "node ^"D:^\phpstudy_pro^\WWW^\gyl^\vendor^\spatie^\browsershot^\src/../bin/browser.js^" ^"^{^^"

  • 本文向大家介绍怎么引入(调用)一个JS文件,包括了怎么引入(调用)一个JS文件的使用技巧和注意事项,需要的朋友参考一下 我们旺旺需要调用别的 js文件。怎么处理? 看随机抽取这个例子。在一个页面中如下: 我们可以把 js 放在另外一个文件里,比如当前文件夹的 a.js 中。 这样 html 页面如下: a.js 这样就行了。 当然,也可以把 a.js放在web上,然后引用成下面这样。 以上所述是小

  • 问题内容: json.php代码 我必须生成文件。 问题答案: 这是一个示例代码:

  • 我有一个开关声明,它检查提交的文本中是否存在特定的字符串。 通常,我会创建专用的文件来处理每个的POST数据。 但是如何在一个中处理多个POST。 对于每个ajax数据,我都包含了一个唯一的标识符,这将作为PHP接收到的ajax的参考 但我不确定如何正确地编写PHP代码来处理提交的$_POST类型。

  • 本文向大家介绍怎么下载一个zip文件?相关面试题,主要包含被问及怎么下载一个zip文件?时的应答技巧和注意事项,需要的朋友参考一下 a标签加属性 文件流的方式 注意:Bolb的方式构建完 blob 对象后才会转换成文件,所以尽量使用a标签的形式进行下载