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

作者站长头像
站长
· 阅读数 10

下面是一个生成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接受这个文件然后再下载。但是下面的一直提示:php中生成了一个excel文件,用ajax怎么接受?

$.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("完成")
            }
        });
回复
1个回答
avatar
test
2024-06-20

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

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

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容