PHP生成Excel之表格(一)
阿新 • • 發佈:2019-02-19
文章使用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效果
和我們的目標對比發現,好像有很多區別。比如:
- 許多顏色樣式沒有配置。
- 數字格式沒有千分位分割符。
- 除了有內容的單元格,其他的單元格應該是空白。
……
存在的問題
從我們的程式碼上看,發現通過phpexcel官方提供的操作物件去生成excel是存在許多問題的。(以下問題不一定能通過上面內容反映)
- 配置樣式比較繁瑣,複雜的樣式可能需要大量程式碼去支援。
- 雖然提供了行和列整體的操作。但是存在單元格合併時,整行或者整列的配置會失效。而且整行或者整列配置樣式時,會導致把表格外部帶入樣式,比較難看。
- 雖有提供預設樣式配置,但是多種配置在同一個單元格時,會出現預設失效的問題。除錯比較麻煩。
- 單元格的自動寬度,對於中文支援不好。
這種生成excel的方式存在許多問題,但是還是能儘量避免的。解決方法可以嘗試。
- 儘量通過迴圈,把樣式配置到單元格上。
- 樣式設定時,有限預設樣式->寫入資料->單元格樣式配製的方式。這種方式一般不會出現配置後不生效的問題。
尋求別的途徑
既然樣式的配置,那麼繁瑣又增加程式碼量。那麼有沒有什麼別的方式來解決這個問題呢?
答案肯定是有的,不然這篇文章就沒有意見。在上一篇文章介紹phpexcel時,有說道。phpexcel能讀取、生成、修改excel檔案。那麼出力直接生成excel檔案,能否能使用別的方式間接生成呢?
下一篇檔案,主要討論如何放棄繁瑣的樣式配置,生成跟目標檔案一樣樣式的檔案。