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

PHP生成Excel之表格(一)

文章使用phpexcel提供的操作方法,生成excel檔案。

Excel目標

我們將要生成的excel最終效果如下圖顯示。
這裡寫圖片描述

程式碼演示

public static function ExportExcel($data,$filename=''){
    $data; //資料陣列(三維陣列)
    $filename=empty($filename)?"":$filename;
    $resultPHPExcel = new \PHPExcel();
    $sheet_title = "每日效果走勢圖";
    // 設定sheet名稱
    $resultPHPExcel->getActiveSheet()
->
setTitle($sheet_title); // 邊框配置陣列 $styleArray = array( 'borders' => array( 'allborders' => array( //'style' => PHPExcel_Style_Border::BORDER_THICK,//邊框是粗的 'style' => \PHPExcel_Style_Border::BORDER_THIN,//細邊框 //'color'
=> array('argb' => 'FFFF0000'), ), ), ); //資料開始 $i = 102; $j = $i; // 設定所在行的字型、大小、加粗 $resultPHPExcel->getActiveSheet()->getStyle($i)->getFont()->setName('微軟雅黑')->setSize(11)->setBold(true); $resultPHPExcel->getActiveSheet()->getStyle($i+29
)
->
getFont()->setName('微軟雅黑')->setSize(11)->setBold(true); // 設定所在行的字型、大小、加粗、顏色 $resultPHPExcel->getActiveSheet()->getStyle($i+1)->getFont()->setName('微軟雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_WHITE); $resultPHPExcel->getActiveSheet()->getStyle($i+30)->getFont()->setName('微軟雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_WHITE); // 設定區域範圍內的單元格背景顏色 $resultPHPExcel->getActiveSheet()->getStyle('A'.($i+1).':B'.($i+1))->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('404040'); $resultPHPExcel->getActiveSheet()->getStyle($i+30)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('404040'); // 給範圍內的表格加上邊框 $resultPHPExcel->getActiveSheet()->getStyle('A'.($i+1).':B'.($i+26))->applyFromArray($styleArray); //單元格範圍內,格式化數字。(取整,百分比) $resultPHPExcel->getActiveSheet()->getStyle('B104:B123')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER); $resultPHPExcel->getActiveSheet()->getStyle('B124:B128')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE); $resultPHPExcel->getActiveSheet()->getStyle('133:148')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER); $resultPHPExcel->getActiveSheet()->getStyle('149:152')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE); //迴圈陣列,寫入資料。 foreach($data['list'] as $item){ foreach($item as $key=>$val){ // 獲取列的標識 $columnID = self::stringFromColumnIndex($key); $cellID=self::stringFromColumnIndex($key).$i; //設定單元格內容水平居中 $resultPHPExcel->getActiveSheet()->getStyle($cellID)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //資料寫入單元格 $resultPHPExcel->getActiveSheet()->setCellValue($cellID,$val); // 非A列時,設定單元格寬度為15 if ($columnID!='A') { $resultPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setWidth(15); } } $i ++; } // 設定A列的單元格寬度 $resultPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20); //在單元格範圍內,給表格新增邊框 $resultPHPExcel->getActiveSheet()->getStyle('A'.($j+30).':'.$columnID.($j+50))->applyFromArray($styleArray); $sum = $arrayLegth-3; //表格末尾兩行,寫入資料 $resultPHPExcel->getActiveSheet()->setCellValue('A153','備註:表格內各資料單位為萬;線索單位為條'); $resultPHPExcel->getActiveSheet()->getStyle('A153')->getFont()->setName('微軟雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_RED); $outputFileName = $filename.date('Y_m_d_H_i').'.xlsx'; $xlsWriter = new \PHPExcel_Writer_Excel2007($resultPHPExcel); //輸出到瀏覽器 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" ); exit; }

關於程式碼
以上程式碼只是生成excel的核心部分。資料來源部分、和其他一些方法的呼叫都沒有給出。
關於資料陣列
這裡我個人習慣將輸出陣列拼接成一個三維陣列。由外到內,第一維度為sheet頁、第二維度為表格的行、第三維度為表格的列。二三維度可以具體到一個單元格。
關於資料寫入
phpexcel的寫入資料,是需要指定單元格的。所以,必須轉換成excel的列表示方式(英文字母)
其他補充
基本上程式碼上都給了比較詳細的註釋。那如果對這些操作樣式的方法不熟悉,還是需要去看一下文件。後面有時間我會專門出一篇文章來解釋文件。

Excel效果

這裡寫圖片描述
和我們的目標對比發現,好像有很多區別。比如:

  1. 許多顏色樣式沒有配置。
  2. 數字格式沒有千分位分割符。
  3. 除了有內容的單元格,其他的單元格應該是空白。
    ……

存在的問題

從我們的程式碼上看,發現通過phpexcel官方提供的操作物件去生成excel是存在許多問題的。(以下問題不一定能通過上面內容反映)

  1. 配置樣式比較繁瑣,複雜的樣式可能需要大量程式碼去支援。
  2. 雖然提供了行和列整體的操作。但是存在單元格合併時,整行或者整列的配置會失效。而且整行或者整列配置樣式時,會導致把表格外部帶入樣式,比較難看。
  3. 雖有提供預設樣式配置,但是多種配置在同一個單元格時,會出現預設失效的問題。除錯比較麻煩。
  4. 單元格的自動寬度,對於中文支援不好。

這種生成excel的方式存在許多問題,但是還是能儘量避免的。解決方法可以嘗試。

  1. 儘量通過迴圈,把樣式配置到單元格上。
  2. 樣式設定時,有限預設樣式->寫入資料->單元格樣式配製的方式。這種方式一般不會出現配置後不生效的問題。

尋求別的途徑

既然樣式的配置,那麼繁瑣又增加程式碼量。那麼有沒有什麼別的方式來解決這個問題呢?
答案肯定是有的,不然這篇文章就沒有意見。在上一篇文章介紹phpexcel時,有說道。phpexcel能讀取、生成、修改excel檔案。那麼出力直接生成excel檔案,能否能使用別的方式間接生成呢?
下一篇檔案,主要討論如何放棄繁瑣的樣式配置,生成跟目標檔案一樣樣式的檔案。