【问题标题】:phpexcel to downloadphpexcel下载
【发布时间】:2012-01-23 20:53:27
【问题描述】:

你好,我是 phpexcel 的新手, 我想知道是否有某种方法可以将我创建的 excel 发送到客户端下载而不将其保存在我的服务器上或在他下载后立即删除它

我正在尝试在页面上创建一个“导出按钮”,该按钮将为用户提供一个“弹出窗口”,其中包含他想要的我刚刚创建的 Excel。

现在在我创建表之后:

$objXLS->getActiveSheet()->getColumnDimension("A")->setAutoSize(true);
$objXLS->getActiveSheet()->getColumnDimension("B")->setAutoSize(true);

$objXLS->getActiveSheet()->setTitle('Test Stats');

$objXLS->setActiveSheetIndex(0);

$objWriter = PHPExcel_IOFactory::createWriter($objXLS, 'Excel5');
$objWriter->save(__DIR__."/test1.xls");

但这会将其保存到我的服务器

谢谢

【问题讨论】:

    标签: php download export phpexcel export-to-excel


    【解决方案1】:

    不要将其保存到文件中,而是将其保存到php://output­Docs:

    $objWriter->save('php://output');
    

    这会将其原样发送到浏览器。

    您想先添加一些headers­Docs,就像在文件下载中很常见,这样浏览器就知道该文件是哪种类型以及应该如何命名(文件名):

    // We'll be outputting an excel file
    header('Content-type: application/vnd.ms-excel');
    
    // It will be called file.xls
    header('Content-Disposition: attachment; filename="file.xls"');
    
    // Write file to the browser
    $objWriter->save('php://output');
    

    先做标题,然后保存。对于 excel 标题,请参阅以下问题:Setting mime type for excel document。

    【讨论】:

    • 我正在获取要下载的文件,但它不是我创建的文件,当我执行 $objWriter->save('php://output') 时,它会弄乱我的漏洞页面 =\
    • 请注意,您在该页面上输出的唯一内容是两个 header 行和 ->save() 操作的输出。您需要在 a) 显示页面或 b) 提供下载之间做出决定。两者都不能轻松地使用一个脚本。但是,您可以为下载创建一个脚本,为页面创建一个脚本,当页面脚本执行完毕后,重定向到下载脚本,这将使浏览器提供另存为对话框。
    • 我的问题是我正在使用 joomla,但我找不到从空页面加载它的方法。每次我尝试时,我都会得到带有菜单和所有内容的洞 joomla 页面。你知道我在哪里可以找到这个问题的答案吗?我不想垃圾邮件堆栈溢出...
    • Dvir - 在您的网址中使用 &format=raw。在你的 mvc 中,创建一个 view.raw.php 文件。
    • 使用php://output时如何设置Content-Length标头?
    【解决方案2】:
    $excel = new PHPExcel();
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="your_name.xls"');
    header('Cache-Control: max-age=0');
    
    // Do your stuff here
    
    $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
    
    // This line will force the file to download
    $writer->save('php://output');
    

    【讨论】:

    • 您好,感谢您的回答。我把这行 $writer->save('php://output');并且它不会下载它在页面上打印出垃圾的文件。你知道为什么会这样吗?
    • 你也设置了标题吗?
    • 我正在尝试使用 PHPPowerpoint 构建一个 PPT,完全按照上面提到的步骤进行,但是将 MIME 类型更改为 application/vnd.openxmlformats-officedocument.presentationml.presentation,它正在我的系统上下载文件,但说 File can't be opened .当代码将文件写入服务器时文件正在工作。
    • 对我来说非常完美。谢谢……
    【解决方案3】:

    使用这个调用

    $objWriter->save('php://output');
    

    要将 XLS 表输出到您所在的页面,只需确保您所在的页面没有其他回显、打印、输出。

    【讨论】:

    • 在共享主机中工作时,使用 $objWriter->save('php://output'); 时出现错误(可能与文件和文件夹权限有关);未捕获的异常“PHPExcel_Writer_Exception”,带有消息“无法打开 php://output 进行写入。”在third_party/PHPExcel/Writer/Excel2007.php:241 堆栈跟踪:#0
    • 我正在尝试使用 PHPPowerpoint 构建一个 PPT,完全按照上面提到的步骤进行,但是将 MIME 类型更改为 application/vnd.openxmlformats-officedocument.presentationml.presentation,它正在我的系统上下载文件,但说 File can't be opened .当代码将文件写入服务器时文件正在工作。
    • 在 ob_start() 之间保存整个代码;和 ob_end_clean();解决问题。
    【解决方案4】:

    可能你已经解决了你的问题,我希望这对你有所帮助。

    所有下载的文件都以空行开头,在我的例子中是四个空行 线,它会产生问题。无论您是使用readfile(); 还是 save('php://output');,这可以通过添加ob_start(); 来解决 脚本的开头和ob_end_clean(); 就在readfile() 之前;要么 save('php://output');.

    【讨论】:

    • 您遇到的问题是您的错误记录和报告:您看不到可能会指出问题的警告:标头已发送。此参考问题对此进行了概述:stackoverflow.com/q/8028957/367456
    • ob_end_clean() 不是od_end_clean()
    【解决方案5】:

    供 XLSX 使用

    SET IN $xlsName 来自 XLSX 的名称,带有扩展名。 示例:$xlsName = 'teste.xlsx';

    $objPHPExcel = new PHPExcel();
    
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="'.$xlsName.'"');
    header('Cache-Control: max-age=0');
    $objWriter->save('php://output');
    

    供 XLS 使用

    SET IN $xlsName 来自 XLS 的名称,带有扩展名。 示例:$xlsName = 'teste.xls';

    $objPHPExcel = new PHPExcel();
    
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="'.$xlsName.'"');
    header('Cache-Control: max-age=0');
    $objWriter->save('php://output');
    

    【讨论】:

    • PSI.: XLS 格式默认定义为“Excel5”,XLSX 为“Excel2007”。
    • 我正在尝试使用 PHPPowerpoint 构建一个 PPT,完全按照上面提到的步骤进行,但是将 MIME 类型更改为 application/vnd.openxmlformats-officedocument.presentationml.presentation,它正在我的系统上下载文件,但说 File can't be opened .当代码将文件写入服务器时文件正在工作。
    • xlsx 的内容类型应为:“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”。见filext.com/faq/office_mime_types.php
    【解决方案6】:
     header('Content-type: application/vnd.ms-excel');
    
     header('Content-Disposition: attachment; filename="file.xlsx"');
    
     header('Cache-Control: max-age=0');
    
     header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    
     header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
    
     header ('Cache-Control: cache, must-revalidate');
    
     header ('Pragma: public');
    
     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    
     $objWriter->save('php://output');
    

    【讨论】:

    • 我正在尝试使用 PHPPowerpoint 构建一个 PPT,完全按照上面提到的步骤进行,但是将 MIME 类型更改为 application/vnd.openxmlformats-officedocument.presentationml.presentation,它正在我的系统上下载文件,但说 File can't be opened .当代码将文件写入服务器时文件正在工作。
    【解决方案7】:

    我尝试了大多数答案提出的$writer->save('php://output'); 命令。

    但这恰好下载了一个损坏的文件。

    要修复它,我必须这样做:

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        header('Content-type: application/vnd.ms-excel');
        header('Content-Disposition: attachment; filename="filename.xlsx"');
        header('Cache-Control: max-age=0');
        $path = 'path/to/temp/file.xlsx';
        // save content to temporary file
        $objWriter->save($path);
        // This header was key to me, in order to get it working
        header("Content-Length: ".filesize($path));
        // output file content
        readfile($path);
        // delete temporary file
        unlink($path);
    

    【讨论】:

      猜你喜欢
      • 2015-05-15
      • 2014-12-03
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多