最近做報表業務,有包含一些排版,對這些非常不熟
竟然都用了,紀錄一下我覺得實用筆記
PHPExcel 已經被廢棄了,取而代之的是PHPOffice/PhpSpreadsheet: A pure PHP library for reading and writing spreadsheet files
但這篇還是以 PHPExcel 為主
PHPOffice/PHPExcel: ARCHIVED
PhpSpreadsheet 一些 note 可以看phpspreadsheet 开发手记 - leestar54 - 博客园 備份圖
載入 PHPEXCEL
PHPExcel/Classes at 1.8 · PHPOffice/PHPExcel
1 2 3 4
| require_once "lib/excel/PHPExcel.php";
require_once "lib/excel/PHPExcel/IOFactory.php";
|
worksheet(工作表)設定
1 2 3 4 5 6 7
| $index = 0; $objPHPExcel->setActiveSheetIndex($index);
$month_date = substr($ym, 0, 4).".".substr($ym, -2); $objPHPExcel->getActiveSheet()->setTitle($month_date);
|
背景顏色設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| $objPHPExcel->getActiveSheet()->getStyle("A1:A2")->applyFromArray( array( "fill" => array( "type" => PHPExcel_Style_Fill::FILL_SOLID, "color"=> array("rgb" => "FFFF00") ), ) );
$backcolor = array( 'fill' => array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'color'=> array('rgb' => 'FFFFAB') ), ); $objPHPExcel->getActiveSheet()->getStyle("A1")->applyFromArray($backcolor); $objPHPExcel->getActiveSheet()->getStyle("A3:B3")->applyFromArray($backcolor);
|
設定框線格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
$style_array = array( 'borders' => array( 'allborders' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN, 'color' => array('rgb' => '000000') ), ) ); $objPHPExcel->getActiveSheet()->getStyle("A1:O".$rows_count."")->applyFromArray($style_array);
$bottom = array( 'borders' => array( 'bottom' => array( 'style' => PHPExcel_Style_Border::BORDER_MEDIUM, 'color' => array('rgb' => '000000') ), ) );
|
字體設定
1 2 3 4 5 6 7 8 9 10 11
| $objPHPExcel->getActiveSheet()->getStyle("A1")->getFont()->setSize(11); $objPHPExcel->getActiveSheet()->getStyle("A2:B10")->getFont()->setSize(10);
$objPHPExcel->getActiveSheet()->getStyle("A1:B2")->getFont()->setBold(true); $objPHPExcel->getActiveSheet()->getStyle("A6:I6")->getFont()->setBold(true); $objPHPExcel->getActiveSheet()->getStyle("N2")->getFont()->setBold(false);
$objPHPExcel->getActiveSheet()->getStyle("A".($rows_count).":O".($rows_count)."")->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle("A3:B3")->getAlignment()->setWrapText(true);
|
欄位給予值
1 2 3
| $month_date = substr($ym, 0, 4)."-".substr($ym, -2); $objPHPExcel->getActiveSheet()->setCellValue("A1", $month_date );
|
欄位類型
1 2 3 4
| $objPHPExcel->getActiveSheet()->getCell("B20")->setValueExplicit(1000, PHPExcel_Cell_DataType::TYPE_NUMERIC);
$objPHPExcel->getActiveSheet()->getStyle("B20")->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00);
|
欄位對齊方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
$objPHPExcel->getActiveSheet()->getStyle("A1:B3")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle("A1:B3")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle("A1:A".$rows_count."")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle("B1:B".$rows_count."")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->getActiveSheet()->mergeCells("A1:B1");
$objPHPExcel->setActiveSheetIndex(0)->mergeCells('A1:C1');
$objPHPExcel->getActiveSheet()->unmergeCells('A18:E22');
|
字體顏色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
$gray = array( 'font' => array( 'color' => array('rgb' => 'BABABA'), )); $objPHPExcel->getActiveSheet()->getStyle("I1:I7")->applyFromArray($gray);
$yellow = array( 'fill' => array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'color' => array('rgb' => 'FFFF00'), )); $objPHPExcel->getActiveSheet()->getStyle("F1:F2")->applyFromArray($yellow); $objPHPExcel->getActiveSheet()->getStyle("I2")->applyFromArray($yellow);
|
欄位寬度、高度設定
1 2 3 4 5 6 7 8 9
|
$objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(12); $objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(16); $objPHPExcel->getActiveSheet()->getRowDimension(2)->setRowHeight(16); $objPHPExcel->getActiveSheet()->getRowDimension(3)->setRowHeight(36);
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(17); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(6);
|
欄位數值資料格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $objPHPExcel->getActiveSheet()->getStyle("A1")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS);
$objPHPExcel->getActiveSheet()->getStyle("D4:D".($rows_count)."")->getNumberFormat()->setFormatCode('#,##0'); $objPHPExcel->getActiveSheet()->getStyle("O4:O".($rows_count)."")->getNumberFormat()->setFormatCode('$#,##0');
$objPHPExcel->getActiveSheet()->getStyle("E3:E".($rows_count)."")->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00); $objPHPExcel->getActiveSheet()->getStyle("G3:G".($rows_count)."")->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00); $objPHPExcel->getActiveSheet()->getStyle("H3:H".($rows_count)."")->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE); $objPHPExcel->getActiveSheet()->getCell('H4')->setValueExplicit('0.3', PHPExcel_Cell_DataType::TYPE_NUMERIC);
|
凍結窗格
1 2 3
| $objPHPExcel->getActiveSheet()->freezePane('A6'); $objPHPExcel->getActiveSheet()->freezePane('D6');
|
建立新的
1 2 3
| $objPHPExcel->createSheet(); $objPHPExcel->setActiveSheetIndex($index+1); $objPHPExcel->getActiveSheet()->setTitle("標題名稱");
|
動態處理橫軸資料(A~AZ)
PHPExcel 可以用 $objPHPExcel->getActiveSheet()->setCellValue("A1", $month_date );
塞值真的非常方便
但是沒辦法動態產生資料
可以透過setCellValueByColumnAndRow
但注意第一個欄(column 英文)是從 0 開始
列是從 1 開始
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, 1,"2019-04月");
但還有一個問題,就是轉換 getStyle 沒有這類似 function
PHPExcel_Cell::stringFromColumnIndex
可以簡單轉換
stringFromColumnIndex(0) = ‘A’ <=> columnIndexFromString
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, 1,."2019-04月");
$objPHPExcel->getActiveSheet()->mergeCellsByColumnAndRow( $index, 1, $index + 8 , 1);
$objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex( $index ).'1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle(PHPExcel_Cell::stringFromColumnIndex( $index ).'1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$col1 = PHPExcel_Cell::stringFromColumnIndex($index + 1); $col2 = PHPExcel_Cell::stringFromColumnIndex($index + 2); $col3 = PHPExcel_Cell::stringFromColumnIndex($index + 3); $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($o2, '4',"={$col1}4+{$col2}4+{$col3}4"); $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($o2, '4',"=SUM({$scol}$5:{$scol}$".($nu+4).")");
|
匯出 EXCEL
1 2 3
| $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('export/filename.xlsx');
|
Ron, Run ~~: PHPExcel - 如何設定儲存格代號
PHP 輸出 Excel ,使用 PHPExcel
PHP excel 設置參數 - IT 閱讀
其他程式使用方式
Java 使用 POI 方式
但我覺得不好用….
JavaScript 有找到 js-xlsx,做匯入資料感覺非常方便
一般報表還可以,複雜格式報表可能不行
但是進階設定需要付費,所以還是很可惜
Node 读写 Excel 文件探究实践 | Aotu.io「凹凸实验室」
【node+demo】使用 xlsx-style 设置表格的宽高等样式 - 简书
使用 js-xlsx 纯前端导出 excel - 个人文章 - SegmentFault 思否
不知道為什麼範例沒辦法用出顏色
網路文章:
公司有遇到RAM 吃很大的問題
phpExcel導出文件時內存溢出的問題 - Cocowool - 博客園