2015-12-30 76 views
2

我在使用PHPExcel(使用.pdf的DomPDF)在一些大型數據數組上生成.xlsx,.ods,.pdf和.cvs文件。如果有問題,我在他們的github頁面和stackoverflow帖子後面跟着例子。我設法讓.csv導出工作,但其餘的不是。PHPExcel:爲.xlsx,.ods和.pdf生成錯誤的二進制文件

運行.xlsx導出時,我得到一個.xlsx文件,無法在我的Mac上打開,也無法在Google文檔中打開。所以我評論了所有在PHP中的header()調用,以便觀察任何PHP錯誤消息。結果沒有,並且我在瀏覽器中得到.xlsx,.pdf或.ods二進制文件,儘管我以後無法打開它們。所以看來我的腳本正在工作,但不知何故產生損壞的二進制文件。

我在這裏做錯了什麼?以下代碼適用於我的.xlsx導出,.pdf/.ods導出的代碼幾乎相同。

$excel = new PHPExcel(); 
// Now set some meta data for that object 
// ... 

     $cellRow = 2; 
     $cellColumn = "B"; 

     // Add data to the excel file 
     foreach($entries as $entry) { 
      // ... 

      $cellColumn = "B"; 
      $cellRow += 1; 

     } 

     // Export 
     header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
     header('Content-Disposition: attachment;filename="export_' . $dateGenerated . '.xlsx"'); 
     header('Cache-Control: max-age=0'); 
     header('Cache-Control: max-age=1'); 
     header('Expires: ' . gmdate('D, d M Y H:i:s')); 
     header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); 
     header('Cache-Control: cache, must-revalidate'); 
     header('Pragma: public'); 
     $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); 
     saveViaTempFile($writer); 

的saveViaTempFile()函數從該計算器後採取:PHPExcel_Writer_Exception with message "Could not close zip file php://output."避免一些其他問題。

TLDR:我正在生成.xlsx,.ods,.pdf二進制文件,代碼應該是正確的。二進制文件以某種方式損壞。我究竟做錯了什麼?謝謝!

編輯:按照要求一些更多的信息: 我正在使用PHPExcel 1.8.1。安裝與作曲家和導入我的本地腳本與require "vendor/autoload.php";我使用error_reporting(E_ALL);並沒有抑制任何東西。仍然沒有單獨顯示通知/錯誤。它只是簡單地生成.xlsx,然後我無法打開。

函數saveVieTempFile()我使用是下列之一,並直複製從鏈接SO線程以上:

static function saveViaTempFile($objWriter) { 
     $filePath = "tmp/" . rand(0, getrandmax()) . rand(0, getrandmax()) . ".tmp"; 
     $objWriter->save($filePath); 
     readfile($filePath); 
     unlink($filePath); 
    } 

是的,我設置CHMOD(777)到/ tmp目錄。否則,我將無法實際接收二進制輸出。

我即使只增加非常簡單的數據文件的工作原理是這樣進行測試:

$excel->setActiveSheetIndex(0)->setCellValue("A3", "hello"); 
     $excel->setActiveSheetIndex(0)->setCellValue("A4", "world"); 
     $excel->setActiveSheetIndex(0)->setCellValue("A5", "this"); 
     $excel->setActiveSheetIndex(0)->setCellValue("A6", "isn't"); 
     $excel->setActiveSheetIndex(0)->setCellValue("C1", "working"); 
$excel->setActiveSheetIndex(0); 

原來連這個簡單的數據不正確的出口,我無法打開在我的Mac文件或之後與谷歌文檔。

欲瞭解更多信息,請在評論中提問,我會更新這篇文章。

+0

嘗試將文件保存到磁盤,並從磁盤打開它們;但是用這麼少的信息,很難說出你可能做錯了什麼 –

+0

@Mark Ba​​ker:當然我下載了這些文件(當header()調用沒有被註釋掉時)。當他們作爲物理文件在磁盤上時,我無法打開它們。我也不是,如果我只是將瀏覽器中打印的二進制文件手動保存到磁盤並將其命名爲.xlsx。如果你想了解更多信息,請告訴我你需要知道什麼。我真的不知道我應該在問題中寫些什麼。 – BoA456

+0

我需要更多的信息來了解你實際上在做什麼來創建這些文件,你運行的是什麼版本的PHPExcel,你是在抑制通知/警告等 –

回答

0

原來我的問題與「可能重複」帖子有些相關。我有一箇中央appIndex.php,其中包括我需要的很多東西。這個中心站點然後包括我當前想要執行的站點 - 例如excelExport.php。

因爲我的中心頁面正在使用ob_start();和ob_end_flush();我的.xlsx和我的.ods導出不起作用。第二我刪除了使用ob_start();我的出口立即奏效。