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

下面是一个生成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("完成")
            }
        });
阅读 999
2 个回答

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题