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. 怎麼把單元格樣式,複製到其他單元格?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章