一:安裝phpoffice/phpspreadsheetphp
composer require phpoffice/phpspreadsheet
二:phpoffice/phpspreadsheet API接口詳解web
PhpSpreadsheet提供了豐富的API接口,能夠設置諸多單元格以及文檔屬性,包括樣式、圖片、日期、函數等等諸多應用,總之你想要什麼樣的Excel表格,PhpSpreadsheet都能作到app
在使用phpoffice/phpspreadsheet的API接口前,確保引入了正確的文件並實例化composer
use PhpOffice\PhpSpreadsheet\Spreadsheet;//引入文件 $spreadsheet = new PhpOffice\PhpSpreadsheet\Spreadsheet();//建立一個新的excel文檔 $sheet = $spreadsheet->getActiveSheet();//獲取當前操做sheet的對象
1:設置字體:框架
$sheet->getStyle('A7:B7')->getFont()->setBold(true)->setName('Arial') ->setSize(10);//將A7至B7兩單元格設置爲粗體字,Arial字體,10號字 $sheet->getStyle('B1')->getFont()->setBold(true);//將B1單元格設置爲粗體字
2:設置顏色yii
$sheet->getStyle('A1')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);//將A1單元格文字顏色設爲紅色
3:設置列寬函數
$sheet->getColumnDimension('A')->setWidth(20);//將A列的寬度設爲20(字符) $sheet->getColumnDimension('B')->setAutoSize(true);//將B列的寬度設爲自動寬度 $sheet->getDefaultColumnDimension()->setWidth(12);//設置默認列寬爲12
4:設置行高字體
$sheet->getRowDimension('10')->setRowHeight(100);//將第十行的高度設爲100pt $sheet->getDefaultRowDimension()->setRowHeight(15);//設置默認行高爲15
5:對齊ui
$sheet->getStyle('A:D')->getAlignment() ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER) //設置垂直居中 ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER) //設置水平居中 ->setWrapText(true); //設置自動換行
6:合併單元格this
$sheet->mergeCells('A1:D2');//A1到D2合併爲一個單元格
7:將合併後的單元格拆分
$sheet->unmergeCells('A1:D2');//將合併後的單元格拆分。
8:使用applyFromArray實現單元格樣式設置
//樣式變量 $style = [ //設置字體樣式 'font' => [ 'name' => 'Arial', 'bold' => true, 'italic' => false, 'underline' => Font::UNDERLINE_DOUBLE, 'strikethrough' => false, 'color' => [ 'rgb' => '808080' ] ], //設置邊框線樣式 'borders' => [ //allBorders全部的邊框線樣式 //左邊框線 'bottom' => [ 'borderStyle' => Border::BORDER_DASHDOT, 'color' => [ 'rgb' => '808080' ] ], //上邊框線 'top' => [ 'borderStyle' => Border::BORDER_DASHDOT, 'color' => [ 'rgb' => '808080' ] ] ], //對齊樣式 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, 'wrapText' => true, ], //是否使用前綴 'quotePrefix' => true ]; $sheet->getStyle('A1:D1')->applyFromArray($style);
9:設置工做表標題
$sheet->setTitle('Hello');;//設置當前工做表標題。
10:設置單元格的格式
$sheet->getStyle('D2')->getNumberFormat() ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);//將D2單元格的格式設爲文本格式 $sheet->getStyle('A1:D2')->getNumberFormat() ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);//將A1到D2的單元格設置爲文本格式
11:換行
$sheet->getCell('A4')->setValue("hello\nworld");//將A4單元格的hello和world換行
12:超連接
//將A2單元格內容設置blog並點擊跳轉https://www.wj0511.com $sheet->setCellValue('A2', 'blog'); $sheet->getCell('A2')->getHyperlink()->setUrl('https://www.wj0511.com');
13:使用函數
經常使用函數有:總和(SUM),最大數(MAX),最小數(MIN),平均值(AVERAGE)
$sheet->setCellValue('B5', '=SUM(B1:B4)');//將B5單元格的內容設爲B1到B4的之和
14:設置文檔屬性
$spreadsheet->getProperties() ->setCreator("author") //做者 ->setLastModifiedBy("last-author") //最後修改者 ->setTitle("title") //標題 ->setSubject("subject") //副標題 ->setDescription("description") //描述 ->setKeywords("keywords") //關鍵字 ->setCategory("category"); //分類
三:簡單實現生成excel(這裏我下載使用的Yii框架自帶的下載方法)
<?php /** * author: wangjian * date: 2019/7/15 */ namespace app\controllers; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use Yii; use yii\web\Controller; class ExcelController extends Controller { /** * 數字轉字母 (相似於Excel列標) * @param Int $index 索引值 * @param Int $start 字母起始值 * @return String 返回字母 */ public function intToChr($index, $start = 65) { $str = ''; if (floor($index / 26) > 0) { $str .= $this->intToChr(floor($index / 26)-1); } return $str . chr($index % 26 + $start); } public function actionIndex() { //頭信息 $header = [ '姓名', '性別', '學歷', '年齡', '身高', ]; //內容 $data = [ [ '小明', '男', '專科', '18', '175' ], [ '小紅', '女', '本科', '18', '155' ], [ '小藍', '男', '專科', '20', '170' ], [ '張三', '男', '本科', '19', '165' ], [ '李四', '男', '專科', '22', '175' ], [ '王二', '男', '專科', '25', '175' ], [ '麻子', '男', '本科', '22', '180' ], ]; $header = array_values($header); $data = array_values($data); //獲取列信息 $column = []; //['A','B','C','D','E'] foreach ($header as $k => $item) { $column[$k] = $this->intToChr($k); } //獲取初始列和最終列 $firstColum = $column[0]; $lastColum = $column[count($column) - 1]; //獲取初始行和最終行 $firstRow = 1; $lastRow = count($data) + 1; $row = 1; $spreadsheet = new Spreadsheet();//建立一個新的excel文檔 $sheet = $spreadsheet->getActiveSheet();//獲取當前操做sheet的對象 $sheet->setTitle('標題'); //設置標題 $sheet->getStyle("{$firstColum}:{$lastColum}")->getAlignment() ->setVertical(Alignment::VERTICAL_CENTER) //設置垂直居中 ->setHorizontal(Alignment::HORIZONTAL_CENTER) //設置水平居中 ->setWrapText(true); //設置自動換行 //設置寬度 $sheet->getDefaultColumnDimension()->setWidth(20); $headerStyle = [ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, ], 'font' => [ 'bold' => true, 'size' => 14, ], ]; $cellStyle = [ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, ], 'borders' => [ 'allBorders' => [ 'borderStyle' => Border::BORDER_THIN, 'color' => ['argb' => 'FF000000'], ] ], 'font' => [ 'size' => 10, ], ]; //將excel的單元格格式設爲文本格式 $sheet->getStyle("{$firstColum}{$firstRow}:{$lastColum}{$lastRow}")->getNumberFormat() ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT); //設置頭信息樣式 $sheet->getRowDimension($row)->setRowHeight(30);//設置行高 $sheet->getStyle("{$firstColum}{$row}:{$lastColum}{$row}")->applyFromArray($headerStyle); //設置頭信息 foreach ($header as $key => $item) { $sheet->setCellValue("{$column[$key]}{$row}", $item); } $row++; foreach ($data as $key => $model) { $sheet->getRowDimension($row)->setRowHeight(30);//設置行高 $sheet->getStyle("{$firstColum}{$row}:{$lastColum}{$row}")->applyFromArray($cellStyle); $i = 0; foreach ($model as $value) { $sheet->setCellValue("{$column[$i]}{$row}", $value); $i++; } $row++; } $file = '表格' . '.xlsx';//保存地址 $writer = new Xlsx($spreadsheet); $writer->save($file);//生成excel文件 Yii::$app->response->sendFile($file, '下載的excel名稱.xlsx')->send(); } }
四:讀取excel文件
$title = [];//excel工做表標題 $info = [];//excel內容 $fileName = "表格.xlsx"; $spreadsheet = IOFactory::load($fileName); //$worksheet = $spreadsheet->getActiveSheet(); //獲取當前文件內容 $sheetAllCount = $spreadsheet->getSheetCount(); // 工做表總數 for ($index = 0; $index < $sheetAllCount; $index++) { //工做表標題 $title[] = $spreadsheet->getSheet($index)->getTitle(); } //讀取第一個工做表 $whatTable = 0; $sheet = $spreadsheet->getSheet($whatTable); $highest_row = $sheet->getHighestRow(); // 取得總行數 $highest_column = $sheet->getHighestColumn(); ///取得列數 字母abc... $highestColumnIndex = Coordinate::columnIndexFromString($highest_column); //轉化爲數字; for ($i = 1; $i <= $highestColumnIndex; $i++) { for ($j = 1; $j <= $highest_row; $j++) { $conent = $sheet->getCellByColumnAndRow($i, $j)->getCalculatedValue(); $info[$j][$i] = $conent; } } var_dump($info);