1. 程式人生 > >PHP生成Excel之表格(二)

PHP生成Excel之表格(二)

php使用phpexcel提供的操作方法,生成excel。

遇到的問題

上一篇文章中PHP生成Excel之表格(一),給出了常規情況下使用phpexcel來生成excel的方法。但是這種方法很麻煩,還需要翻文件檢視很多方法。而且生成的樣式也不是最完美的。那麼這篇文章,我們就思考如何解決這個,既繁瑣又不完美的生成方式。

思考

之前結束phpexcel這個外掛時,有說到。除了能讀取excel、生成excel外還能修改excel。換而言之,我們能開啟一個一直配置好樣式的excel,然後修改或者寫入我們的資料,最後再儲存。貌似這個思路可行。

Excel模板

在寫程式碼前,我們需要準備一個excel模板。同時需要把樣式除錯好。
這裡寫圖片描述


按照思路,我們現在,只需要開啟這個檔案。然後把資料寫入到空白的地方。

程式碼演示

// $data 為三維陣列資料來源。
// $outputname  為匯出的檔名。
public function  ExportExcelForCopy($data,$outputname){
    $filename = "../web/excelmodel/excel_copy.xlsx";
    $objReader = new \PHPExcel_Reader_Excel2007();
    //讀取檔案到物件中
    $resultPHPExcel = $objReader->load($filename
); $outputFileName = $outputname.date('Y_m_d_H_i').'.xlsx'; $i = 0; // 這裡的迴圈用於寫入到sheet foreach ($data as $key => $value) { //取第一個sheet $resultPHPExcel->setActiveSheetIndex($i); $i=$i+1; //資料寫入 第三個引數為開始的行數。 $this->_new_exprot_excel($value,$resultPHPExcel
,96); } $xlsWriter = new \PHPExcel_Writer_Excel2007($resultPHPExcel); $savepath = Yii::$app->basePath.'/uploads/tmp_excel/'.date('Ym',time()).'/'; if(!is_dir($savepath)){ mkdir($savepath,0777,true); } //輸出到瀏覽器 header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-Disposition:inline;filename="'.$outputFileName.'"'); header("Content-Transfer-Encoding: binary"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); $xlsWriter->save( "php://output" ); } /* 資料寫入方法 */ public function _new_exprot_excel($data,$resultPHPExcel,$mun=1){ $i = $mun; foreach($data as $item){ foreach($item as $key=>$val){ $cellID=self::stringFromColumnIndex($key).$i; // 這裡是讀取單元格內容。當為空的時候才寫入資料。 $date = $resultPHPExcel->getActiveSheet()->getCell($cellID)->getValue(); if ($date=='') { $resultPHPExcel->getActiveSheet()->setCellValue($cellID,$val); } } $i ++; } }

我的習慣,把註釋寫到程式碼中。這樣也比較好明確到行上。基本上程式碼內容個前一篇文章一樣。就是少了樣式配置的內容。多了讀取excel檔案的部分。整體看,程式碼簡潔易懂。程式碼量也少了很多。
看著好像沒有什麼問題,那就看看執行效果吧。

Excel效果

這裡寫圖片描述
暫時不看第二個表格無樣式部分。有樣式部分是不是跟目標excel一模一樣?
簡短的程式碼,實現效果比之前好很多。或者說跟要求一模一樣。唯一的缺陷就是,這是一個長度可變的陣列(excel列數不固定,無法配樣式)。如果報表固定長度,那我們實現方式就完美了。

分析問題

從生成的效果來看,如果一個報表寬高固定,就能採用這種方式生成excel。簡答、高效。修改起來也方便,關一個模板,程式碼都不需要修改。
到這裡,小部分的報表,對於我們沒什麼問題了。但是為了能支援更多的報表,使生產excel一點都不困難,還是需要優化一下,而且也是可以優化的。
從報表看,我們只要解決下面問題,可變陣列生成excel的問題也能解決了。

  1. excel中的樣式能否複製?
  2. 怎麼把單元格樣式,複製到其他單元格?