PHP生成Excel之表格(二)
阿新 • • 發佈:2019-02-07
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的問題也能解決了。
- excel中的樣式能否複製?
- 怎麼把單元格樣式,複製到其他單元格?