2013-05-14 24 views
2

我試圖讓PHPExcel與Zend2一起工作。實際上它正在工作,但不是我想要的(我可以寫入文件,但不能在不保存的情況下下載)。我發現了一些例子,在那裏你只需做這樣的事情:Zend2中的PHPExcel控制器

$objPHPExcel = .... 

header('Content-Type: application/vnd.ms-excel'); 
header('Content-Disposition: attachment;filename="01simple.xls"'); 
header('Cache-Control: max-age=0'); 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 
$objWriter->save('php://output'); 

和文件被允許下載。我如何在Zend2 Controller中實現類似的功能?我已經嘗試到目前爲止:

public function generateRaportAction() 
{ 
    $objPHPExcel = new PHPExcel(); 
    $objPHPExcel->getActiveSheet()->setCellValue('B8', 'Some value'); 
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 

    $response = $this->getEvent()->getResponse(); 
    $response->getHeaders()->clearHeaders()->addHeaders(array(
     'Pragma' => 'public', 
     'Content-Type' => 'application/vnd.ms-excel', 
     'Content-Disposition' => 'attachment; filename="test.xls"', 
     'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0', 
     'Content-Transfer-Encoding' => 'binary', 
    )); 
    $objWriter->save('php://output'); 
    return $response; 
} 

但它給了我「頁面上的回聲」輸出。我的第二次嘗試是:

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

但結果是一樣的。

+0

你不能用'php:// output'替換服務器上的實際文件,然後將該文件設置爲響應內容嗎? –

+0

我打算用「內存」方案來解決這個問題,而不是在服務器上保存。如果我找不到任何解決方案,那麼我想我會這樣做 – kamil

+1

也許有一個去在這然後:http://stackoverflow.com/a/9480344/1053820 –

回答

2

由於@Aydin哈桑評論,我已經試過:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
ob_start(); 
$objWriter->save('php://output'); 
$excelOutput = ob_get_clean(); 

,然後簡單地通過$excelOutput的響應內容,和它的作品簡直太棒了!

$response->setContent($excelOutput); 
0

所以,你可以存檔,在你的控制器動作,這樣的事情:

public function testPHPExcelAction() { 
    // I recommend constructor injection for all needed dependencies ;-) 
    $this->phpExcelService = $this->serviceLocator->get('mvlabs.phpexcel.service'); 

    $objPHPExcel = $this->phpExcelService->createPHPExcelObject(); 
    $objPHPExcel->getProperties()->setCreator("Diego Drigani") 
     ->setLastModifiedBy("Diego Drigani") 
     ->setTitle("MvlabsPHPExcel Test Document") 
     ->setSubject("MvlabsPHPExcel Test Document") 
     ->setDescription("Test document for MvlabsPHPExcel, generated using Zend Framework 2 and PHPExcel.") 
     ->setKeywords("office PHPExcel php zf2 mvlabs") 
     ->setCategory("Test result file"); 
    $objPHPExcel->setActiveSheetIndex(0) 
     ->setCellValue('A1', 'Hello') 
     ->setCellValue('B2', 'world!') 
     ->setCellValue('C1', 'Hello') 
     ->setCellValue('D2', 'world!'); 
    $objPHPExcel->setActiveSheetIndex(0) 
     ->setCellValue('A4', 'Miscellaneous glyphs') 
     ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç'); 

    $objPHPExcel->getActiveSheet()->setCellValue('A8',"Hello\nWorld"); 
    $objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1); 
    $objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true); 
    $objPHPExcel->getActiveSheet()->setTitle('Mvlabs'); 
    $objPHPExcel->setActiveSheetIndex(0); 

    $objWriter = $this->phpExcelService->createWriter($objPHPExcel, 'Excel2007'); 

    $response = $this->phpExcelService->createHttpResponse($objWriter, 200, [ 
     'Pragma' => 'public', 
     'Cache-control' => 'must-revalidate, post-check=0, pre-check=0', 
     'Cache-control' => 'private', 
     'Expires' => '0000-00-00', 
     'Content-Type' => 'application/vnd.ms-excel; charset=utf-8', 
     'Content-Disposition' => 'attachment; filename=' . 'myTest.xls', 
     ]); 

    return $response; 

}  

要做到這一點在上面的方式,你需要使用MvlabsPHPExcel模塊,提供給您的可能性輕鬆使用PHPOffice/PHPExcel庫到ZF2應用程序。