Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPExcel强制下载问题_Php_Apache_Phpexcel_Xlsx_Force Download - Fatal编程技术网

PHPExcel强制下载问题

PHPExcel强制下载问题,php,apache,phpexcel,xlsx,force-download,Php,Apache,Phpexcel,Xlsx,Force Download,我知道这个问题可能被分为几个部分提出,但我找不到这个问题的确切答案。我使用PHPExcel生成一个Excel文件(很明显),代码可以生成文件,但当我包含用于强制下载的代码时,它会破坏文件。我最新版本的脚本如下所示: function make_xls_spreadsheet(){ /** Error reporting */ error_reporting(E_ALL); /* Set the save path */ define('XLSX_SAVE_PATH', 'tmp/'); /

我知道这个问题可能被分为几个部分提出,但我找不到这个问题的确切答案。我使用PHPExcel生成一个Excel文件(很明显),代码可以生成文件,但当我包含用于强制下载的代码时,它会破坏文件。我最新版本的脚本如下所示:

function make_xls_spreadsheet(){

/** Error reporting */
error_reporting(E_ALL);

/* Set the save path */
define('XLSX_SAVE_PATH', 'tmp/');

/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');

/** PHPExcel */
include 'PHPExcel.php';

/** PHPExcel_Writer_Excel2007 */
include 'PHPExcel/Writer/Excel2007.php';


/* Create a new PHPExcel Object */
$objPHPExcel = new PHPExcel();


/* Add some metadata to the file */
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");

/* Set active worksheet to first */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Segments');

/* Add some data to the worksheet */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');


/* Write to server */
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);

$filename = "tony1.xlsx";

// Works fine up to here

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
//$objWriter->save('php://output');
$objWriter->save(XLSX_SAVE_PATH . $filename);
readfile(XLSX_SAVE_PATH . $filename);


echo "DONE!";

$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);



}
请记住,当我删除强制代码部分时,文件会生成,并且我可以通过FTP将其下载。但是,生成和强制生成文件都会导致文件损坏。通常我可以单击“打开并修复”(Office2011 MacOSX),但显然这是不可取的

谁能帮我理解一下:

  • 为什么会产生腐败?以及为什么我不强制下载时它工作正常
  • 保存/强制的正确顺序是什么(使用PHP的header()函数)
  • 如果有更好的方法
  • 非常感谢

    ****更新****这是我点击“修复”时的代码:

    
    修复结果为tony1 03178.xml
    在文件“Macintosh HD:Users:tony.diloreto:Downloads:tony1.xlsx”中检测到错误
    Excel已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃。
    
    这会将excel文件输出到浏览器:

    readfile(XLSX_SAVE_PATH . $filename);  
    
    然后你把它吐出来,它会成为浏览器下载的excel文件的一部分

    echo "DONE!";
    
    基本上你是在发送

    [excel data]DONE!
    
    当Excel仅期望

    [excel data]
    

    //答案实际上属于@Dagon

    答案其实很简单,只需要一个简单的
    exit()呼叫

    最终代码块:

    function make_xls_spreadsheet(){
    
    /** Include path **/
    set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');
    
    /** PHPExcel */
    include 'PHPExcel.php';
    
    /** PHPExcel_Writer_Excel2007 */
    include 'PHPExcel/Writer/Excel2007.php';
    
    
    /* Create a new PHPExcel Object */
    $objPHPExcel = new PHPExcel();
    
    /** Determine filename **/
    $filename = "tony1.xlsx";
    
    /** Set header information **/
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="' . $filename . '"');
    header('Cache-Control: max-age=0');
    
    
    /* Add some metadata to the file */
    $objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
    $objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
    $objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
    $objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
    $objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
    
    /* Set active worksheet to first */
    $objPHPExcel->setActiveSheetIndex(0);
    $objPHPExcel->getActiveSheet()->setTitle('Segments');
    
    /* Add some data to the worksheet */
    $objPHPExcel->setActiveSheetIndex(0);
    $objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
    $objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
    $objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
    $objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');
    
    
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="'.$filename.'"');
    header('Cache-Control: max-age=0');
    
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter->save('php://output');
    
    exit();
    
    }
    

    尝试按如下方式修改File.php:

    受保护的静态$\u useUploadTempDirectory=TRUE


    在文件夹phpexcel/Classes/phpexcel/Shared中(这不是最好的方法,但对我来说很有效)。

    关闭但没有雪茄。它仍然说一些内容“不可读”,必须修复。还有其他想法吗?与其将其保存到文件中,不如将其保存到
    php://output
    ,除非您需要本地副本,否则
    $objWriter->save('php://output');谢谢-那么我需要readfile()行吗?如果我这样做,它会变成什么?替换行
    $objWriter=
    之后的所有内容。。使用
    $objWriter->save('php://output');无骰子-脚本的新底部是:
    头('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');标题('Content-Disposition:attachment;filename=“.”.$filename.'”);标头('Cache-Control:max age=0')$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007')$objWriter->save命令php://output');      返回
    fyi“没有骰子”和“接近但没有雪茄”。这是我今天回答的第二个问题,答案是
    exit()
    
    function make_xls_spreadsheet(){
    
    /** Include path **/
    set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');
    
    /** PHPExcel */
    include 'PHPExcel.php';
    
    /** PHPExcel_Writer_Excel2007 */
    include 'PHPExcel/Writer/Excel2007.php';
    
    
    /* Create a new PHPExcel Object */
    $objPHPExcel = new PHPExcel();
    
    /** Determine filename **/
    $filename = "tony1.xlsx";
    
    /** Set header information **/
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="' . $filename . '"');
    header('Cache-Control: max-age=0');
    
    
    /* Add some metadata to the file */
    $objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
    $objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
    $objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
    $objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
    $objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
    
    /* Set active worksheet to first */
    $objPHPExcel->setActiveSheetIndex(0);
    $objPHPExcel->getActiveSheet()->setTitle('Segments');
    
    /* Add some data to the worksheet */
    $objPHPExcel->setActiveSheetIndex(0);
    $objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
    $objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
    $objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
    $objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');
    
    
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="'.$filename.'"');
    header('Cache-Control: max-age=0');
    
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter->save('php://output');
    
    exit();
    
    }