#導入類庫 require_once 'PHPExcel/Classes/PHPExcel.php'; require_once 'PHPExcel/Classes/PHPExcel/Writer/Excel5.php'; //Office 03格式寫類 require_once 'PHPExcel/Classes/PHPExcel/Writer/Excel2007.php'; //Office 07格式寫類 #基礎操做 $objPHPExcel = \PHPExcel_IOFactory::load('a.xls'); //讀入指定excel文件 $objPHPExcel->setActiveSheetIndex(0); //指定活動工做表 $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setName('宋體'); $objPHPExcel->getProperties()->setTitle('xxx'); #單元格寫入 $objPHPExcel->getActiveSheet()->setCellValue('A3', 'xxx'); //設定A3單元格值爲xxx #單元格合併 $objPHPExcel->getActiveSheet()->mergeCells('A3:B2'); //設定A1至B2單元格 #插入一行 $objPHPExcel->getActiveSheet()->insertNewRowBefore($pBefore = 1, $pNumRows = 1); #單元格背景色 $objPHPExcel->getActiveSheet()->getStyle( 'A1:B10')->getFill()->getStartColor()->setARGB('FFFFFF'); #單元格繪圖 $objDrawing = new \PHPExcel_Worksheet_Drawing(); $objDrawing->setPath('a.jpg'); //指定圖片路徑。若遠程圖片需PHPExcel/Classes/PHPExcel/Worksheet/Drawing.php:106處file_exists換成file_get_contents $objDrawing->setCoordinates('A4'); //指定在A4單元格繪圖 $objDrawing->setName('Photo'); $objDrawing->setDescription('Photo'); $objDrawing->setHeight(120); $objDrawing->setWidth(100); $objDrawing->setOffsetX(7); $objDrawing->setOffsetY(7); $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
function getWriter($type, $objPHPExcel) { switch ($type) { case 'pdf': require_once 'PHPExcel/Classes/PHPExcel/Writer/PDF.php'; $rendererName = \PHPExcel_Settings::PDF_RENDERER_MPDF; //指定使用mpdf類庫 $rendererLibraryPath = 'PHPExcel/MPDF57'; if (!\PHPExcel_Settings::setPdfRenderer($rendererName, $rendererLibraryPath)) die('請配置pdf支持組件'); $objWriter = new \PHPExcel_Writer_PDF($objPHPExcel); $objWriter->setPreCalculateFormulas(false); break; case 'xls': require_once 'PHPExcel/Classes/PHPExcel/Writer/Excel2007.php'; $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); break; case 'html': default: $objWriter = new \PHPExcel_Writer_HTML($objPHPExcel); # html輸出主要用於調試 break; } return $objWriter; } function setDownStreamHeader($MIME, $file_name) { ob_end_clean(); header("Content-type: $MIME"); $ua = $_SERVER["HTTP_USER_AGENT"]; if (preg_match("/MSIE/", $ua) || preg_match("%Trident/7.0%", $ua) || preg_match("/Edge/", $ua)) { header('Content-Disposition: attachment; filename="' . rawurlencode($file_name) . '"'); } else { if (preg_match("/Firefox/", $ua)) header("Content-Disposition: attachment; filename*=\"utf8''" . $file_name . '"'); else header('Content-Disposition: attachment; filename="' . $file_name . '"'); } header("Pragma:no-cache"); header("Expires:0"); } $objPHPExcel = \PHPExcel_IOFactory::load('test.xls'); switch ($_GET['export_type']) { case 'xls': setDownStreamHeader('application/vnd.ms-excel', 'test.xls'); $objWriter = getWriter('xls', $objPHPExcel); break; case 'pdf': setDownStreamHeader('application/pdf', 'test.pdf'); $objWriter = getWriter('pdf', $objPHPExcel); break; case 'html': default: $objWriter = getWriter('html', $objPHPExcel); break; } $objWriter->save('php://output');
#PHPExcel/Classes/PHPExcel/Writer/PDF/mPDF.php:105處加兩行設定: $pdf->useAdobeCJK = true; $pdf->SetAutoFont(AUTOFONT_ALL);
正則調用的e模式致使導出失敗 類庫裏面多處preg_replace調用使用了元字符e,而部分低版本php不支持正則表達式e元字符
e元字符的不當使用並致使pdf報錯的觸發點在類庫裏面大概有五六處
因爲e元字符是一個shell下的子進程php調用,因此報錯信息不會反饋到當前php進程中,故即使你配置了錯誤打印到屏幕, 頁面也不會顯示報錯信息, 必須查看php報錯日誌
查看php報錯日誌,把提示的preg_replace中元字符e的調用替換爲preg_replace_callback形式的調用php
部分版本phpexcel類庫單元格樣式判斷錯誤css
lib/PHPExcel/Classes/PHPExcel/Writer/HTML.php:1236處加個if判斷 if (!$this->_useInlineCss) { $cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex(); }
頭部設置後,直接將Table Html返回,瀏覽器自動處理爲xls下載html
header('Content-type: application/xls'); header('Content-Disposition: attachment; filename="aaa.xls"'); echo <<<EOL <table border="1"> <caption>表格</caption> <thead> <tr> <th>id</th> <th>訂單號</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>aaa</td> </tr> </tbody> </table> EOL;