最近使用phpexcel導出文件時,遇到了網頁可能暫時無法連接,或者它已永久性地移動到了新網址的問題,困擾我了好久。在網上找了好多種解決方法,除了將excel版本由excel2007降低到excel5 有點用外,其他的都嘗試無果。但是,將excel版本由excel2007降低到excel5又引起了其他問題,比如,導出報告中的批注不能生效,復制導出excel中的內容到另一個excel,顏色格式都發生變化等等。最終無可奈何,非要將這個問題從根本上解決才能消除大患。
思路如下:
1. 找到根本原因
使用$objWriter->save($filename); $this->display(); 這種方式查看生成excel報錯的具體現象
代碼如下:
$filename="test.xlsx"; ob_end_clean(); ini_set('memory_limit','-1'); set_time_limit(0); unlink($filename); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save($filename); $this->display(); // header("Pragma: public"); // header("Expires: 0"); // header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); // header("Content-Type:application/force-download"); // header("Content-Type:application/vnd.ms-execl"); // header("Content-Type:application/octet-stream"); // header("Content-Type:application/download"); // header('Content-Disposition:attachment;filename='.$filename); // header("Content-Transfer-Encoding:binary"); // ob_end_clean(); // $objWriter->save( 'php://output'); // unlink($filename); // exit;
修改后導報告的頁面出現如下報錯:
2. 查找出錯文件
由上圖可知,報錯的根本原因在Rels.php的第434行,找到該文件的434行,如下所示:
找到了報錯點之后,再由白圖中的錯誤信息可以看出是Rels.php 260行通過如下參數調用了_writeRelationship方法,但參數中第4個值$pTarget為NULL,所以引出了Invalid parameters passed.這個報錯
繼續追蹤 Rels.php 260行,如下所示,在該處調用_writeRelationship方法時通過$hyperlink->getUrl()獲取到了NULL,該方法與getHyperlink有關
3.反思
1)我在系統到報告出現上述現象的情況並不是持續的,而是有些出問題,有些又沒有。
2)這個報錯與getHyperlink有關,而我的excel會設置日志超鏈接
所以我猜測是設置超鏈接時,沒有對日志url進行判斷,可能某些時候的的url是NULL,所以導致了上述問題。最終排查結果與猜想一致,解決問題。
出現“網頁可能暫時無法連接,或者它已永久性地移動到了新網址”這個問題的原因可能有很多,但根據實際情況抽絲剝繭,比一直在網上嘗試各種解決方法去掩蓋這個問題要好太多了,繼續加油吧!