如何在不存储在本地的情况下直接将EXCEL文件输出给用户


How do I output EXCEL file directly to user without storing locally?

我使用PHPExcel生成excel文件(疯狂吧?),其中包含我从数据库中获得的信息,问题是每当我创建文件时,它都会保存在服务器中,然后我只需向用户发送该文件的链接,以便他可以访问它。

我怀疑这是正确的方法,我想要的是只将文件发送到浏览器,而不将其保存在服务器上。

如何在不存储在本地的情况下直接向用户输出EXCEL文件

代码:

$fileName  = "Request_" . $idRequest . "_Update.xls";
$objWriter = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$objWriter->save($fileName);
$objPHPExcel = PHPExcel_IOFactory::load($fileName);

echo json_encode(array(
        "ExitCode" => 0,
        "Message" => "Success",            
        "data" => $request,
        "File" => "../reports/$fileName"
    ));

一旦我在接收它的$.ajax调用中接收到File,只需将其添加到锚标签:

$.ajax({
       ...
       success : function(response){
           $('#container').append('<a href="'+response.File+'">Here is your file</a>
       }

看看这个。

//    reset all output buffering
    while (ob_get_level() > 0) {
        ob_end_clean();
    }
    header('Content-type: application/ms-excel');
    header('Content-Disposition:  inline; attachment; filename='.$filename);
    // we can't send any more headers after this
    flush();
    $excel = new PhpExcel();
    $excel->setActiveSheetIndex(0);
    $sheet = $excel->getActiveSheet();
    // in this example, $data was an array in the format row => value
    //  data structure is not relevant to issue
    foreach ($data as $key => $value) {
         // add data to sheet here
         $sheet->SetCellValue('A' . $key, $value);
         // etc...
    }
    $writer = new PHPExcel_Writer($excel);
    // push to browser
    $writer->save('php://output');

接受的对此问题的回答显示了如何在没有mime类型问题的情况下处理成功响应,即提供文件供下载,或由js处理失败响应(例如显示在当前html页面中)

您可以发送

header("Content-Disposition: attachment; filename='"file.xls'"");

强制下载,然后

header("Content-type:application/vnd.ms-excel");

告诉浏览器你正在发送一个excel文件,最后只是将该文件作为html table:进行回显

<?php
header("Content-Disposition: attachment; filename='"file.xls'"");
header("Content-type:application/vnd.ms-excel");
echo "<html><table>...</table></html>";  // your table data here..
?>

Excel可以用<table>打开.html文件,所以应该不会有任何问题。