php 使用phpoffice/phpspreadsheet拓展操做excel

一:安裝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);

參考:https://phpspreadsheet.readth...

相關文章
相關標籤/搜索