javascript PHPSpreadsheet IOFactory编写器未保存要下载到客户端的文件

3phpmpom  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(98)

我最近使用composer安装了PhpSpreadsheet,我使用的是php 7.4。
我试图打开一个Excel文件,改变一些细胞的价值观,然后保存文件(下载到客户端)与这些变化
经过一些研究和添加头接受.xlsx文件和自动下载工作,这工作完美,但只有一次.没有改变任何东西,第二天运行同样的东西,后台似乎什么也没有发生。看起来IOfactory::load可以读取文件,但自动下载不再发生。
我尝试通过JavaScript从客户端将加载的$spreadsheet记录到控制台,可以看到sheetml乱码。这告诉我加载器正在工作,编写器正在工作,也许下载的标题是错误的,但与众多在线示例相比,我看不出有什么问题。我大吃一惊,为什么它只能工作一次,现在不知道问题可能在哪里。
任何帮助弄清楚为什么这将工作,然后停止工作,而不改变任何东西将不胜感激。
excelCompleteExport.php:

require 'PHPSpreadsheet/vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("NedbankBBCommTemplate_REMSYSTEM.xlsx");

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="result2.xlsx"');

set_error_handler (
    function($errno, $errstr, $errfile, $errline) {
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);     
    }
);

try
{
    \PhpOffice\PhpSpreadsheet\Shared\File::setUseUploadTempDirectory(true);
    $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
    $writer->save('php://output');
    //echo "<script type='text/javascript'>console.log('done');</script>";
}

catch(Exception $e) 
{
    echo "<script type='text/javascript'>console.log('".$e->getMessage()."');</script>";
}

从JavaScript调用:

function ExpExcel()
{
    $("#InvisElement").load("excelCompleteExport.php");
}

HTML按钮调用JavaScript函数:

<button id="ExpExcel" style="width: 200px;" class="navbtn" type="submit" onclick="ExpExcel(); return false;">Export to Excel</button>
vfhzx4xs

vfhzx4xs1#

自动下载主要受浏览器限制(防止恶意软件下载)。您可以尝试通过a link/按钮上的jQuery在新的Tab中打开生成的. xlsx文件。

qmelpv7a

qmelpv7a2#

function ExpExcel()
{
$.ajax({
type: 'GET',
cache: false,
url: "excelCompleteExport.php",
  
xhrFields: {
        // make sure the response knows we're expecting a binary type in 
return.
        // this is important, without it the excel file is marked corrupted.
        responseType: 'arraybuffer'
    }
})
    .done(function (data, status, xmlHeaderRequest) {
        var downloadLink = document.createElement('a');
        var blob = new Blob([data],
            {
                type: xmlHeaderRequest.getResponseHeader('Content-Type')
            });
        var url = window.URL || window.webkitURL;
        var downloadUrl = url.createObjectURL(blob);
        var fileName = 'result.xlsx';

      

        if (typeof window.navigator.msSaveBlob !== 'undefined') {
            window.navigator.msSaveBlob(blob, fileName);
        } else {
            if (fileName) {
                if (typeof downloadLink.download === 'undefined') {
                    window.location = downloadUrl;
                } else {
                    downloadLink.href = downloadUrl;
                    downloadLink.download = fileName;
                    document.body.appendChild(downloadLink);
                    downloadLink.click();
                }
            } else {
                window.location = downloadUrl;
            }

            setTimeout(function () {
                url.revokeObjectURL(downloadUrl);
            },
                500);
        }
    });
}
f4t66c6m

f4t66c6m3#

不知道你是否已经解决了这个问题,但根据文档:
目前,所需的PHP最低版本是PHP 8.0。
https://phpspreadsheet.readthedocs.io/en/latest/

相关问题