PhpSpreadsheet介绍

  1. 简介

PhpSpreadsheet 是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式

PhpSpreadsheet 提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到。

使用 PhpSpreadsheet 开发的PHP要求 7.1或更高版本
PhpSpreadsheet 支持链式操作
  1. 安装

使用 composer 安装,在项目根目录下执行下面命令,即可安装。本次是在ThinkPHP5框架里使用。

composer require phpoffice/phpspreadsheet

使用

  1. 引用和实例化

    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    
    // 实例化 Spreadsheet 对象
    $spreadsheet = new Spreadsheet();
  2. 获取工作簿

getActiveSheet

// 获取活动工作薄
$sheet = $spreadsheet->getActiveSheet();

单元格操作

  1. 获取单元格
    两种获取单元格方式

    • getCell
    • getCellByColumnAndRow 数字单元格坐标获取单元格
$cell = $sheet->getCell('A1');
$cell = $sheet->getCellByColumnAndRow(1,1); // 参数:列、行
  1. 设置单元格的值

    • setValue
    • setCellValue
    • setCellValueByColumnAndRow
// 获取单元格
$cellA = $sheet->getCell('A1');
// 设置单元格值
$cellA->setValue('姓名'); // 设置A1单元格的值为姓名
// 给A1设置值,参数:单元格位置,值
$sheet->setCellValue('A1','ID');
//给A2赋值 hello
$sheet->setCellValueByColumnAndRow(1, 2, ‘hello’);
  1. 单元格文字样式
  • getStyle 获取单元格样式
  • getFont 获取单元格文字样式
  • setBold 设置文字粗细
  • setName 设置文字字体
  • setSize 设置文字大小

    //将A1至D1单元格设置成粗体
    $sheet->getStyle('A1:D1')->getFont()->setBold(true);
    //将A1单元格设置成粗体,黑体,10号字
    $sheet->getStyle('A1')->getFont()->setBold(true)->setName('黑体')->setSize(10);
  1. 单元格文字颜色
  • getColor() 获取坐标颜色
  • setRGB() 设置字体颜色(颜色值带#)
  • getRGB() 获取字体颜色
  • setARGB() 设置字体颜色(颜色值不带#)
  • getARGB() 获取字体颜色

    // B3单元格设置颜色
    $sheet->getStyle('B3')->getFont()->getColor()->setRGB('#AEEEEE');
    $sheet->getStyle('B3')->getFont()->getColor()->setARGB('FFFF0000');
  1. 单元格内文字换行

    • setWrapText 设置文本里的\n符合为:换行
    //使用 \n 进行单元格内换行,相当于 Alt+Enter
    $sheet->getCell('A1')->setValue("hello\nworld");
    $sheet->getStyle('A1')->getAlignment()->setWrapText(true);
  2. 单元格列和行

    • getColumnDimension 获取一列
    • getWidth 获取一列的宽度
    • setWidth 设置一列的宽度
    • setAutoSize 设置一列的宽度自动调整
    • getDefaultColumnDimension 获取一列的默认值
    //设置默认列宽20
    $sheet->getDefaultColumnDimension()->setWidth(20);
    //将A列宽度设置成20
    $sheet->getColumnDimension(‘A’)->setWidth(20);
    //自动计算列宽
    $sheet->getColumnDimension(‘A’)->setAutoSize(true);
    • getRowDimension 获取一行
    • getRowHeight 获取一行的高度
    • setRowHeight 设置一行的高度
    //设置默认行高
    $sheet->getDefaultRowDimension()->setRowHeight(20);
    //设置第一行行高为20pt
    $sheet->getRowDimension(‘1’)->setRowHeight(20);
    • getHighestColumn 获取总列数
    • getHighestRow 获取总行数
    echo $sheet->getHighestColumn();
    echo $sheet->getHighestRow();
  3. 单元格样式

    • applyFromArray 设置单元格样式

      对齐
    use PhpOffice\PhpSpreadsheet\Style\Alignment;
    // 居中对齐
    $styleArray = [
     'alignment' => [
         'horizontal' => Alignment::HORIZONTAL_CENTER, //水平居中
         'vertical' => Alignment::VERTICAL_CENTER, //垂直居中
     ],
    ];
    $worksheet->getStyle('A1')->applyFromArray($styleArray);
    • 边框

      上 下 左 右 全部 边框都可设置
    //红色边框
    use PhpOffice\PhpSpreadsheet\Style\Border;
    // 外边框
    // Border 类中的常量都是边框样式
    // Border::BORDER_THICK 边框样式
    $styleArray = [
     'borders' => [
         'outline' => [
             'borderStyle' => Border::BORDER_THICK,
             'color' => ['argb' => 'FFFF0000'],
         ],
     ],
    ];
    $worksheet->getStyle('B2:G8')->applyFromArray($styleArray);
  4. 单元格合并和拆分

    • mergeCells 合并
    • unmergeCells 拆分
    // 合并A1到C1列
    $sheet->mergeCells('A1:C4');
    // 合并A1到A4行
    $sheet->mergeCells('A1:A4');
    // 合并后,赋值只能给A1,开始的坐标。
    $sheet->getCell('A1')->setValue('西安');
    // 拆分
    $sheet->mergeCells('A1:C4');
    $sheet->unmergeCells('A1:A4');
  5. 超链接

    • getHyperlink 获取单元格链接
    • setUrl 设置单元格链接
    $spreadsheet->getActiveSheet()->setCellValue('E6', 'xxxx的博客');
    $spreadsheet->getActiveSheet()->getCell('E6')->getHyperlink()->setUrl('https://blog.csdn.net/u011167662');
  6. 使用函数

    • SUM求和A;VERAGE平均数;MIN最小值;MAX最大值
    $sheet->setCellValue('A3', '=SUM(A1:A2)');
    $sheet->setCellValue('A3', '=MAX(A1:A2)');
  7. 批量赋值

    • fromArray 从数组中的值填充工作表

      参数1:数据(数组)

    参数2:去除某个值
    参数3:从哪个位置开始

    $sheet->fromArray(
         [
             [1,'欧阳克','18岁','188cm'],
             [2,'黄蓉','17岁','165cm'],
             [3,'郭靖','21岁','180cm']
         ], 3, 'A2' );
  8. 写入图片
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
//写入图片
$drawing = new Drawing();
$drawing->setName('Logo')->setDescription('Logo')->setPath('../files/1.jpg')->setHeight(30)->setCoordinates('D6')->setOffsetX(50)->setOffsetY(6);
$drawing->setRotation(25);
$drawing->getShadow()->setVisible(true);
$drawing->getShadow()->setDirection(45);

KaTeX parse error: Expected 'EOF', got '&' at position 9: drawing-&̲gt;setWorksheet…sheet);

工作簿操作

  1. xlsx 文件导出

    • IOFactory::createWriter 写入到文件
    use PhpOffice\PhpSpreadsheet\IOFactory;
    // MIME 协议,文件的类型,不设置,会默认html
    header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
    // MIME 协议的扩展
    $filename = date('Y-m-d').'工作报告单';
    header('Content-Disposition:attachment;filename='.$filename .'.xlsx');
    // 缓存控制
    header('Cache-Control:max-age=0');
    $write = IOFactory::createWriter($spreadsheet, 'Xlsx');
    $write->save('php://output');
  2. xls 文件导出
// MIME 协议,文件的类型,不设置,会默认html
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
// MIME 协议的扩展
$filename = date('Y-m-d').'工作报告单';
header('Content-Disposition:attachment;filename='.$filename .'.xls');
// 缓存控制
header('Cache-Control:max-age=0');
$write = IOFactory::createWriter($spreadsheet, 'Xls');
$write->save('php://output');
  1. 设置工作簿标题

    • setTitle
    $sheet->setTitle('标题1');

实战

  1. 导出简单数据(使用 ThinkPHP5 框架)
<?php

namespace app\api\controller;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\IOFactory;

class Excel
{
    public function exporteasy()
    {
        $spreadsheet = new Spreadsheet();
        $worksheet = $spreadsheet->getActiveSheet();
        $title = 'Excel导出';
        $worksheet->setTitle($title);
        $worksheet->mergeCells('B2:D2');
        $worksheet->getRowDimension(1)->setRowHeight(50);
        $worksheet->getStyle('B2:D2')->applyFromArray([
            'alignment' => [
                'horizontal' => Alignment::HORIZONTAL_CENTER,
                'vertical' => Alignment::VERTICAL_CENTER,
            ],
            'borders' => [
                'outline' => [
                    'borderStyle' => Border::BORDER_THIN,
                    'color' => ['argb' => '000000']
                ],
            ],
            'font' => [
                'name' => '黑体',
                'bold' => true,
                'size' => 22
            ]
        ]);
        $worksheet->setCellValueByColumnAndRow(2, 2, $title);
        $worksheet->setCellValueByColumnAndRow(2, 3, '姓名');
        $worksheet->setCellValueByColumnAndRow(3, 3, '性别');
        $worksheet->setCellValueByColumnAndRow(4, 3, '年龄');
        $worksheet->setCellValueByColumnAndRow(2, 4, '张三');
        $worksheet->setCellValueByColumnAndRow(3, 4, '男');
        $worksheet->setCellValueByColumnAndRow(4, 4, '20');


        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename=Excel导出.xlsx');
        header('Cache-Control: max-age=0');

        $write = IOFactory::createWriter($spreadsheet, 'Xlsx');
        $write->save('php://output');
    }
}

点赞(0)

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿
发表
评论
返回
顶部