本文会介绍php使用PhpSpreadsheet操作Excel,供大家参考,具体内容如下:
 
PhpSpreadsheet介绍
 
1、简介
 PhpSpreadsheet 是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式
 PhpSpreadsheet 提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到。
 
 
 使用 PhpSpreadsheet 开发的PHP要求 7.1或更高版本
 PhpSpreadsheet 支持链式操作
 
 
2、安装
 使用 composer 安装,在项目根目录下执行下面命令,即可安装。本次是在ThinkPHP5框架里使用。
 
 
 composer require phpoffice/phpspreadsheet
 
 
使用
 
1、引用和实例化
 
use PhpOffice\PhpSpreadsheet\Spreadsheet;
$spreadsheet = new Spreadsheet();
 
2、获取工作簿
 getActiveSheet
 
$sheet = $spreadsheet->getActiveSheet();
 
单元格操作
 
1、获取单元格
 两种获取单元格方式
 
- getCell
- getCellByColumnAndRow 数字单元格坐标获取单元格
$cell = $sheet->getCell('A1');
$cell = $sheet->getCellByColumnAndRow(1,1); 
 
2、设置单元格的值
 
- setValue
- setCellValue
- setCellValueByColumnAndRow
$cellA = $sheet->getCell('A1');
$cellA->setValue('姓名'); 
$sheet->setCellValue('A1','ID');
$sheet->setCellValueByColumnAndRow(1, 2, 'hello');
 
3、单元格文字样式
 
- getStyle 获取单元格样式
- getFont 获取单元格文字样式
- setBold 设置文字粗细
- setName 设置文字字体
- setSize 设置文字大小
$sheet->getStyle('A1:D1')->getFont()->setBold(true);
$sheet->getStyle('A1')->getFont()->setBold(true)->setName('黑体')->setSize(10);
 
4、单元格文字颜色
 
- getColor() 获取坐标颜色
- setRGB() 设置字体颜色(颜色值带#)
- getRGB() 获取字体颜色
- setARGB() 设置字体颜色(颜色值不带#)
- getARGB() 获取字体颜色
$sheet->getStyle('B3')->getFont()->getColor()->setRGB('#AEEEEE');
$sheet->getStyle('B3')->getFont()->getColor()->setARGB('FFFF0000');
 
5、单元格内文字换行
 
- setWrapText 设置文本里的\n符合为:换行
$sheet->getCell('A1')->setValue("hello\nworld");
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);
 
6、单元格列和行
 
- getColumnDimension 获取一列
- getWidth 获取一列的宽度
- setWidth 设置一列的宽度
- setAutoSize 设置一列的宽度自动调整
- getDefaultColumnDimension 获取一列的默认值
$sheet->getDefaultColumnDimension()->setWidth(20);
$sheet->getColumnDimension('A')->setWidth(20);
$sheet->getColumnDimension('A')->setAutoSize(true);
 
- getRowDimension 获取一行
- getRowHeight 获取一行的高度
- setRowHeight 设置一行的高度
$sheet->getDefaultRowDimension()->setRowHeight(20);
$sheet->getRowDimension('1')->setRowHeight(20);
 
- getHighestColumn 获取总列数
- getHighestRow 获取总行数
echo $sheet->getHighestColumn();
echo $sheet->getHighestRow();
 
7、单元格样式
 
- 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;
$styleArray = [
    'borders' => [
        'outline' => [
            'borderStyle' => Border::BORDER_THICK,
            'color' => ['argb' => 'FFFF0000'],
        ],
    ],
];
$worksheet->getStyle('B2:G8')->applyFromArray($styleArray);
 
8、单元格合并和拆分
 
- mergeCells 合并
- unmergeCells 拆分
$sheet->mergeCells('A1:C4');
$sheet->mergeCells('A1:A4');
$sheet->getCell('A1')->setValue('西安');
$sheet->mergeCells('A1:C4');
$sheet->unmergeCells('A1:A4');
 
9、超链接
 
- getHyperlink 获取单元格链接
- setUrl 设置单元格链接
$spreadsheet->getActiveSheet()->setCellValue('E6', 'xxxx的博客');
$spreadsheet->getActiveSheet()->getCell('E6')->getHyperlink()->setUrl('https://blog.csdn.net/u011167662');
 
10、使用函数
 SUM求和A;VERAGE平均数;MIN最小值;MAX最大值
 
$sheet->setCellValue('A3', '=SUM(A1:A2)');
$sheet->setCellValue('A3', '=MAX(A1:A2)');
 
11、批量赋值
 
参数1:数据(数组)
 参数2:去除某个值
 参数3:从哪个位置开始
 
$sheet->fromArray(
        [
            [1,'欧阳克','18岁','188cm'],
            [2,'黄蓉','17岁','165cm'],
            [3,'郭靖','21岁','180cm']
        ], 3, 'A2' );
 
12、写入图片
 
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);
 
$drawing->setWorksheet($sheet);
 
工作簿操作
 
1、xlsx 文件导出
 
- IOFactory::createWriter 写入到文件
use PhpOffice\PhpSpreadsheet\IOFactory;
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
$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 文件导出
 
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
$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');
 
3、设置工作簿标题
 
$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');
	}
}
 
导出表格截图:
 2、导出数据
 liu_system_log 管理员操作记录表
 
public function export()
	{
		$spreadsheet = new Spreadsheet();
		$sheet = $spreadsheet->getActiveSheet();
		$styleArray = [
			'alignment' => [
		        'horizontal' => Alignment::HORIZONTAL_CENTER,
		        'vertical' => Alignment::VERTICAL_CENTER,
		    ],
		    'borders' => [
		        'outline' => [
		            'borderStyle' => Border::BORDER_THICK,
		        ],
		    ],
		];
		$sheet->getDefaultColumnDimension()->setWidth(20);
		$sheet->getDefaultRowDimension()->setRowHeight(20);
		
		$tabletitle = '管理员操作记录表';
		$sheet->mergeCells('A1:D1');
		$sheet->getRowDimension('1')->setRowHeight(40);
		$sheet->getStyle('A1')->applyFromArray($styleArray);
		$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16);
		$sheet->setCellValue('A1', $tabletitle);
		
		$sheet->getStyle('A2:D2')->applyFromArray($styleArray);
		$sheet->getStyle('A2:D2')->getFont()->setBold(true)->setSize(12);
		$sheet->setCellValue('A2','管理员姓名');
	    $sheet->setCellValue('B2','操作');
	    $sheet->setCellValue('C2','ip');
	    $sheet->setCellValue('D2','操作时间');
	    $data = Db::name('system_log')->select();
	    $sort = 0;
	    foreach ($data as $v){
	    	$sheet->setCellValue('A' . ($sort + 3), $v['admin_name']);
		    $sheet->setCellValue('B' . ($sort + 3), $v['page']);
		    $sheet->setCellValue('C' . ($sort + 3), $v['ip']);
		    $sheet->setCellValue('D' . ($sort + 3), date('Y-m-d H:i:s', $v['add_time']));
		    $sort++;
	    }
	    
	    $sheettitle = '管理员操作记录表';
	    $sheet->setTitle($sheettitle);
		header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		
		$filename = '管理员操作记录表';
		header('Content-Disposition: attachment;filename=' . $filename .'.xlsx');
		header('Cache-Control: max-age=0');
		$write = IOFactory::createWriter($spreadsheet, 'Xlsx');
		$write->save('php://output');
	}