PHP使用PhpSpreadsheet操作Excel实例详解


Posted in PHP onMarch 26, 2020

本文实例讲述了PHP使用PhpSpreadsheet操作Excel。分享给大家供大家参考,具体如下:

一、PhpSpreadsheet 介绍

1、PhpSpreadsheet 是什么

PhpSpreadsheet是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式
PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到

  • 使用 PhpSpreadsheet 开发的PHP要求 7.1或更高版本
  • PhpSpreadsheet 支持链式操作
2、PhpSpreadsheet 支持的文件格式

PHP使用PhpSpreadsheet操作Excel实例详解

3、PhpSpreadsheet 官方网址
  • https://phpspreadsheet.readthedocs.io
4、PhpSpreadsheet 安装
  • composer require phpoffice/phpspreadsheet

二、基础知识

1、载入
<?php
  # 载入composer自动加载文件 require 瑞块儿
  require 'vendor/autoload.php'; autoload 奥特老特
  # 给类文件的命名空间起个别名
  use PhpOffice\PhpSpreadsheet\Spreadsheet;
  # 实例化 Spreadsheet 对象
  $spreadsheet = new Spreadsheet();
2、获取工作簿
  • getActiveSheet
<?php
  # 载入composer自动加载文件
  require 'vendor/autoload.php';
  # 给类文件的命名空间起个别名
  use PhpOffice\PhpSpreadsheet\Spreadsheet;
  # 实例化 Spreadsheet 对象
  $spreadsheet = new Spreadsheet();
  # 获取活动工作薄
  $sheet = $spreadsheet->getActiveSheet();
3、获取单元格
  • 两种获取单元格方式
  • getCell
  • getCellByColumnAndRow
<?php
  # 载入composer自动加载文件
  require 'vendor/autoload.php';
  # 给类文件的命名空间起个别名
  use PhpOffice\PhpSpreadsheet\Spreadsheet;
  # 实例化 Spreadsheet 对象
  $spreadsheet = new Spreadsheet();
  # 获取活动工作薄
  $sheet = $spreadsheet->getActiveSheet();
  # 获取单元格
  $cell = $sheet->getCell('A1');
  $cell = $sheet->getCellByColumnAndRow(1,1);
4、设置单元格
  • setValue
  • 参数:单元格的值
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	# 获取单元格
	$cellA = $sheet->getCell('A1');
	# 设置单元格值
	$cellA->setValue('欧阳克');

	# 获取单元格
	$cellB = $sheet->getCellByColumnAndRow(1,2);
	# 设置单元格值
	$cellB->setValue('黄蓉');

	# 获取设置单元格,链式操作
	$sheet->getCell('A3')->setValue('郭靖');
	$sheet->getCellByColumnAndRow(1,4)->setValue('杨康');
5、获取单元格值
  • getValue 获取单元格值
  • getCoordinate 获取单元格坐标
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	# 获取单元格
	$cellA = $sheet->getCell('A1');
	# 设置单元格值
	$cellA->setValue('欧阳克');

	echo '值: ', $cellA->getValue(),PHP_EOL;
	echo '坐标: ', $cellA->getCoordinate();
6、保存表格
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	# 获取单元格
	$cellA = $sheet->getCell('A1');
	# 设置单元格值
	$cellA->setValue('欧阳克');

	# 获取单元格
	$cellB = $sheet->getCellByColumnAndRow(1,2);
	# 设置单元格值
	$cellB->setValue('黄蓉');

	# 获取设置单元格,链式操作
	$sheet->getCell('A3')->setValue('郭靖');
	$sheet->getCellByColumnAndRow(1,4)->setValue('杨康');

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');

三、强化单元格

1、设置单元格
  • setCellValue
  • 参数1:单元格位置
  • 参数2:单元格的值
  • setCellValueByColumnAndRow
  • 参数1:列位置
  • 参数2:行位置
  • 参数3:单元格的值
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->setCellValueByColumnAndRow(1, 2, 1);
	$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
	$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
	$sheet->setCellValueByColumnAndRow(4, 2, '188cm');

	$sheet->setCellValueByColumnAndRow(1, 3, 2);
	$sheet->setCellValueByColumnAndRow(2, 3, '黄蓉');
	$sheet->setCellValueByColumnAndRow(3, 3, '17岁');
	$sheet->setCellValueByColumnAndRow(4, 3, '165cm');

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
2、单元格文字样式
  • getStyle 获取单元格样式
  • getFont 获取单元格文字样式
  • setBold 设置文字粗细
  • setName 设置文字字体
  • setSize 设置文字大小
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->setCellValueByColumnAndRow(1, 2, 1);
	$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
	$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
	$sheet->setCellValueByColumnAndRow(4, 2, '188cm');

	$sheet->setCellValueByColumnAndRow(1, 3, 2);
	$sheet->setCellValueByColumnAndRow(2, 3, '黄蓉');
	$sheet->setCellValueByColumnAndRow(3, 3, '17岁');
	$sheet->setCellValueByColumnAndRow(4, 3, '165cm');

	$sheet->getStyle('B2')->getFont()->setBold(true)->setName('宋体')->setSize(20);

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
3、单元格文字颜色
  • getColor() 获取坐标颜色
  • setRGB() 设置字体颜色
  • getRGB() 获取字体颜色
  • setARGB() 设置字体颜色
  • getARGB() 获取字体颜色
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->setCellValueByColumnAndRow(1, 2, 1);
	$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
	$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
	$sheet->setCellValueByColumnAndRow(4, 2, '188cm');

	$sheet->setCellValueByColumnAndRow(1, 3, 2);
	$sheet->setCellValueByColumnAndRow(2, 3, '黄蓉');
	$sheet->setCellValueByColumnAndRow(3, 3, '17岁');
	$sheet->setCellValueByColumnAndRow(4, 3, '165cm');

	$sheet->getStyle('B2')->getFont()->getColor()->setRGB('#AEEEEE');
	echo $sheet->getStyle('B2')->getFont()->getColor()->getRGB(),PHP_EOL;

	$sheet->getStyle('B3')->getFont()->getColor()->setARGB('FFFF0000');
	echo $sheet->getStyle('B3')->getFont()->getColor()->getARGB();

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
4、单元格格式
  • getNumberFormat 获取格式
  • setFormatCode 设置格式
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','2019-10-10 10:10:10');
	$sheet->setCellValue('A2','2019-10-10 10:10:10');
	$sheet->getStyle('A2')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDD2);

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
  • setWrapText 设置文本里的\n符合为:换行
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1',"欧阳克\n黄蓉");
	$sheet->getStyle('A1')->getAlignment()->setWrapText(true);

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
  • getHyperlink 获取单元格链接
  • setUrl 设置单元格链接
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','www.php.cn');
	$sheet->getCell('A1')->getHyperlink()->setUrl('http://www.php.cn');

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');

四、批量操作

1、使用公式
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','10');
	$sheet->setCellValue('B1','15');
	$sheet->setCellValue('C1','20');
	$sheet->setCellValue('D1','25');
	$sheet->setCellValue('E1','30');
	$sheet->setCellValue('G1','35');
	$sheet->setCellValue('A2', '总数:');
	$sheet->setCellValue('B2', '=SUM(A1:G1)');
	$sheet->setCellValue('A3', '平均数:');
	$sheet->setCellValue('B3', '=AVERAGE(A1:G1)');
	$sheet->setCellValue('A4', '最小数:');
	$sheet->setCellValue('B4', '=MIN(A1:G1)');
	$sheet->setCellValue('A5', '最大数:');
	$sheet->setCellValue('B5', '=MAX(A1:G1)');
	$sheet->setCellValue('A6', '最大数:');
	$sheet->setCellValue('B6', '\=MAX(A1:G1)');	// 使用转义字符

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
2、批量赋值
  • fromArray 从数组中的值填充工作表
  • 参数1:数据(数组)
  • 参数2:去除某个值
  • 参数3:从哪个位置开始
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->fromArray(
		[
			[1,'欧阳克','18岁','188cm'],
			[2,'黄蓉','17岁','165cm'],
			[3,'郭靖','21岁','180cm']
		],
		3,
		'A2'
	);

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
3、合并单元格
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->mergeCells('A1:B5');

	$sheet->getCell('A1')->setValue('欧阳克');

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');

合并后,赋值只能给A1,开始的坐标。

4、拆分单元格
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->mergeCells('A1:B5');

	$sheet->unmergeCells('A1:B5');

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
5、列和行操作
  • getColumnDimension 获取一列
  • getWidth 获取一列的宽度
  • setWidth 设置一列的宽度
  • setAutoSize 设置一列的宽度自动调整
  • getDefaultColumnDimension 获取一列的默认值
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	echo $sheet->getColumnDimension('A')->getWidth();

	$sheet->getColumnDimension('A')->setWidth(100);

	$sheet->getColumnDimension('B')->setAutoSize(true);

	$sheet->getDefaultColumnDimension()->setWidth(1);

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
  • getRowDimension 获取一行
  • getRowHeight 获取一行的高度
  • setRowHeight 设置一行的高度
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	echo $sheet->getRowDimension(1)->getRowHeight();

	$sheet->getRowDimension(1)->setRowHeight(100);

	$sheet->getDefaultRowDimension()->setRowHeight(1);

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
  • getHighestColumn 获取总列数
  • getHighestRow 获取总行数
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->setCellValueByColumnAndRow(1, 2, 1);
	$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
	$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
	$sheet->setCellValueByColumnAndRow(4, 2, '188cm');

	$sheet->setCellValueByColumnAndRow(1, 3, 2);
	$sheet->setCellValueByColumnAndRow(2, 3, '黄蓉');
	$sheet->setCellValueByColumnAndRow(3, 3, '17岁');
	$sheet->setCellValueByColumnAndRow(4, 3, '165cm');

	echo $sheet->getHighestColumn();
	echo $sheet->getHighestRow();

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');
6、单元格样式
  • applyFromArray
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->setCellValueByColumnAndRow(1, 2, 1);
	$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
	$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
	$sheet->setCellValueByColumnAndRow(4, 2, '188cm');

	$styleArray = [
		// use PhpOffice\PhpSpreadsheet\Style\Alignment; 文件里常量,就是参数
		// Alignment::HORIZONTAL_CENTER 水平居中
		// Alignment::VERTICAL_CENTER	垂直居中
		'alignment' => [
			// 'horizontal' => Alignment::HORIZONTAL_CENTER, //水平居中
			// 'vertical' => Alignment::VERTICAL_CENTER, //垂直居中
			'horizontal' => 'center', //水平居中
			'vertical' => 'center', //垂直居中
		],
		// use PhpOffice\PhpSpreadsheet\Style\Border; 文件里常量,就是参数
		// Border::BORDER_THICK 边框样式
		'borders' => [
			'outline' => [
				// 'borderStyle' => '\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK',
				'borderStyle' => 'thick',
				'color' => ['argb' => 'FFFF0000'],
			],
		],
		'font' => [
			'name' => '黑体',
			'bold' => true,
			'size' => 22
		]
	];

	$sheet->getStyle('A1')->applyFromArray($styleArray);

	# Xlsx类 将电子表格保存到文件
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
	$writer = new Xlsx($spreadsheet);
	$writer->save('1.xlsx');

五、工作薄操作

1、xlsx 文件下载
  • IOFactory::createWriter 写入到文件
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->setCellValueByColumnAndRow(1, 2, 1);
	$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
	$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
	$sheet->setCellValueByColumnAndRow(4, 2, '188cm');

	// MIME 协议,文件的类型,不设置,会默认html
	header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
	// MIME 协议的扩展
	header('Content-Disposition:attachment;filename=1.xlsx');
	// 缓存控制
	header('Cache-Control:max-age=0');

	$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
	// php://output 它是一个只写数据流, 允许你以 print 和 echo一样的方式写入到输出缓冲区。 
	$writer->save('php://output');
2、xls 文件下载
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->setCellValueByColumnAndRow(1, 2, 1);
	$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
	$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
	$sheet->setCellValueByColumnAndRow(4, 2, '188cm');

	$filename = '1.xls';
	header('Content-Type:application/vnd.ms-excel');
	header('Content-Disposition:attachment;filename=1.xls');
	header('Cache-Control:max-age=0');

	$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
	$writer->save('php://output');
3、设置工作簿标题
  • setTitle
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','姓名');
	$sheet->setCellValue('C1','年龄');
	$sheet->setCellValue('D1','身高');

	$sheet->setCellValueByColumnAndRow(1, 2, 1);
	$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
	$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
	$sheet->setCellValueByColumnAndRow(4, 2, '188cm');

	$sheet->setTitle('欧阳克');

	// MIME 协议,文件的类型,不设置,会默认html
	header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
	// MIME 协议的扩展
	header('Content-Disposition:attachment;filename=1.xlsx');
	// 缓存控制
	header('Cache-Control:max-age=0');

	$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
	// php://output 它是一个只写数据流, 允许你以 print 和 echo一样的方式写入到输出缓冲区。 
	$writer->save('php://output');
4、读取表格
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';

	# 创建读操作
	$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
	# 打开文件、载入excel表格
	$spreadsheet = $reader->load('1.xlsx');
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	# 获取 单元格值 和 坐标
	$cellC1 = $sheet->getCell('B2');
	echo '值: ', $cellC1->getValue(),PHP_EOL;
	echo '坐标: ', $cellC1->getCoordinate(),PHP_EOL;

	$sheet->setCellValue('B2','欧阳锋');

	# 获取 单元格值 和 坐标
	$cellC2 = $sheet->getCell('B2');
	echo '值: ', $cellC2->getValue(),PHP_EOL;
	echo '坐标: ', $cellC2->getCoordinate();

六、office 后缀对应的 content-type

后缀 MIME Type
.doc application/msword
.dot application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotx application/vnd.openxmlformats-officedocument.wordprocessingml.template
.docm application/vnd.ms-word.document.macroEnabled.12
.dotm application/vnd.ms-word.template.macroEnabled.12
.xls application/vnd.ms-excel
.xlt application/vnd.ms-excel
.xla application/vnd.ms-excel
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltx application/vnd.openxmlformats-officedocument.spreadsheetml.template
.xlsm application/vnd.ms-excel.sheet.macroEnabled.12
.xltm application/vnd.ms-excel.template.macroEnabled.12
.xlam application/vnd.ms-excel.addin.macroEnabled.12
.xlsb application/vnd.ms-excel.sheet.binary.macroEnabled.12
.ppt application/vnd.ms-powerpoint
.pot application/vnd.ms-powerpoint
.pps application/vnd.ms-powerpoint
.ppa application/vnd.ms-powerpoint
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.potx application/vnd.openxmlformats-officedocument.presentationml.template
.ppsx application/vnd.openxmlformats-officedocument.presentationml.slideshow
.ppam application/vnd.ms-powerpoint.addin.macroEnabled.12
.pptm application/vnd.ms-powerpoint.presentation.macroEnabled.12
.potm application/vnd.ms-powerpoint.presentation.macroEnabled.12
.ppsm application/vnd.ms-powerpoint.slideshow.macroEnabled.12

七、实战

1、导出数据
  • login_log 登陆日志表
CREATE TABLE `login_log` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`uid` int(11) DEFAULT NULL COMMENT '管理员ID',
	`client` tinyint(4) unsigned DEFAULT '0' COMMENT '0-PC 1-ios 2-android',
	`add_time` int(11) DEFAULT '0' COMMENT '创建时间',
	`ip` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '登录IP',
	PRIMARY KEY (`id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1122 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='登录日志';
  • index.php 数据列表页面
<?php 
	# 载入方法库
	require 'function.php';

	$select = select('login_log','*');

	if(empty($select)){
		exit;
	}else{
		foreach($select as &$v){
			switch ($v['client']) {
				case 0:
					$v['client'] = 'PC电脑';
					break;
				case 1:
					$v['client'] = '苹果手机';
					break;
				case 2:
					$v['client'] = '安卓手机';
					break;
			}
			$v['add_time'] = date('Y-m-d H:i:s',$v['add_time']);
		}
	}
?>
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>导出数据</title>
		<link rel="stylesheet" href="layui/css/layui.css" rel="external nofollow" rel="external nofollow" >
	</head>
	<body>
		<div style="text-align:center;">
			<a href="download.php" rel="external nofollow" rel="external nofollow" class="layui-btn layui-btn-radius layui-btn-danger">导出数据</a>
		</div>
		<table class="layui-table">
			<thead>
				<tr>
					<th>ID</th>
					<th>用户ID</th>
					<th>登陆设备</th>
					<th>登陆时间</th>
					<th>登陆ip</th>
				</tr> 
			</thead>
			<tbody>
				<?php 
					foreach($select as $v){
				?>
					<tr>
						<td><?php echo $v['id'] ?></td>
						<td><?php echo $v['uid'] ?></td>
						<td><?php echo $v['client'] ?></td>
						<td><?php echo $v['add_time'] ?></td>
						<td><?php echo $v['ip'] ?></td>
					</tr>
				<?php 
					} 
				?>
			</tbody>
		</table>
	</body>
</html>
  • download.php 导出操作
<?php 
	# 载入方法库
	require 'function.php';

	$select = select('login_log','*');

	if(empty($select)){
		exit;
	}else{
		foreach($select as &$v){
			switch ($v['client']) {
				case 0:
					$v['client'] = 'PC电脑';
					break;
				case 1:
					$v['client'] = '苹果手机';
					break;
				case 2:
					$v['client'] = '安卓手机';
					break;
			}
			$v['add_time'] = date('Y-m-d H:i:s',$v['add_time']);
		}
	}
	
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use \PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','ID');
	$sheet->setCellValue('B1','用户ID');
	$sheet->setCellValue('C1','登陆设备');
	$sheet->setCellValue('D1','登陆时间');
	$sheet->setCellValue('E1','登陆ip');
	$sheet->fromArray(
		$select,
		null,
		'A2'
	);

	// MIME 协议,文件的类型,不设置,会默认html
	header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
	// MIME 协议的扩展
	header('Content-Disposition:attachment;filename=1.xlsx');
	// 缓存控制
	header('Cache-Control:max-age=0');

	$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
	// php://output 它是一个只写数据流, 允许你以 print 和 echo一样的方式写入到输出缓冲区。 
	$writer->save('php://output');
?>
2、导入数据
  • 数据库
# 商品分类表
CREATE TABLE `shop_cat` (
	`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
	`pid` int(10) unsigned DEFAULT '0' COMMENT '父ID',
	`name` varchar(50) DEFAULT NULL COMMENT '分类名',
	`status` tinyint(1) unsigned DEFAULT '1' COMMENT '状态 1开启 0关闭',
	PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='分类表';

INSERT INTO `shop_cat` VALUES (1, 0, '女装', 1);
INSERT INTO `shop_cat` VALUES (2, 0, '男装', 1);
INSERT INTO `shop_cat` VALUES (3, 0, '孕产', 1);
INSERT INTO `shop_cat` VALUES (4, 1, '连衣裙', 1);
INSERT INTO `shop_cat` VALUES (5, 1, '牛仔裤', 1);
INSERT INTO `shop_cat` VALUES (6, 2, '衬衫', 1);
INSERT INTO `shop_cat` VALUES (7, 3, '睡衣', 1);

# 商品表
CREATE TABLE `shop_list` (
	`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
	`cat_id` int(10) unsigned DEFAULT NULL COMMENT '分类ID',
	`cat_fid` int(10) unsigned DEFAULT NULL COMMENT '分类父ID',
	`title` varchar(200) NOT NULL COMMENT '商品标题',
	`price` double(10,2) unsigned NOT NULL COMMENT '价格',
	`img` varchar(200) NOT NULL COMMENT '商品图片',
	`add_time` int(10) unsigned NOT NULL COMMENT '添加时间',
	PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
  • index.php 导入页面
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>导出数据</title>
		<link rel="stylesheet" href="layui/css/layui.css" rel="external nofollow" rel="external nofollow" >
	</head>
	<body>
		<div style="text-align:center;">
			<button type="button" class="layui-btn" id="up"><i class="layui-icon">?</i>上传文件</button>
			<a href="download.php" rel="external nofollow" rel="external nofollow" class="layui-btn layui-btn-danger"><i class="layui-icon">?</i>示例下载</a>
		</div>
		<div id="log" style="text-align:center;">
			
		</div>
	</body>
</html>
<script src="layui/layui.js" charset="utf-8"></script>
<script>
	layui.use('upload', function(){
		var $ = layui.jquery
		,upload = layui.upload;
		upload.render({
			elem: '#up'
			,url: 'data.php'
			,accept: 'file' //普通文件
			,done: function(res){
				if(res.code == 0){
					for(var i=0;i<res.data.length;i++){
						$("#log").append('<div>'+res.data[i]+'</div>');
					}
				}
			}
		});
	})
</script>
  • 导入功能
<?php
	$file = $_FILES['file']['tmp_name'];
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 载入方法库
	require 'function.php';

	# 创建读操作
	$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
	# 打开文件、载入excel表格
	$spreadsheet = $reader->load($file);
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	# 获取总列数
	$highestColumn = $sheet->getHighestColumn();
	# 获取总行数
	$highestRow = $sheet->getHighestRow();

	# 列数 改为数字显示
	$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
	$log = [];
	for($a=2;$a<$highestRow;$a++){
		$title = $sheet->getCellByColumnAndRow(1,$a)->getValue();
		$cat_fname = $sheet->getCellByColumnAndRow(2,$a)->getValue();
		$cat_name = $sheet->getCellByColumnAndRow(3,$a)->getValue();
		$price = $sheet->getCellByColumnAndRow(4,$a)->getValue();
		$img = $sheet->getCellByColumnAndRow(5,$a)->getValue();

		$cat_fid = find('shop_cat','id','name="'.$cat_fname.'"');
		$cat_id = find('shop_cat','id','name="'.$cat_name.'"');
		$data = [
			'title' => $title,
			'cat_fid' => $cat_fid['id'],
			'cat_id' => $cat_id['id'],
			'price' => $price,
			'img' => $img,
			'add_time' => time(),
		];
		$ins = insert('shop_list',$data);
		if($ins){
			$log[] = '第'.$a.'条,插入成功';
		}else{
			$log[] = '第'.$a.'条,插入失败';
		}
	}
	echo json_encode(['code'=>0,'msg'=>'成功','data'=>$log]);
  • 下载示例(范文)
<?php
	# 载入composer自动加载文件
	require 'vendor/autoload.php';
	# 给类文件的命名空间起个别名
	use \PhpOffice\PhpSpreadsheet\Spreadsheet;
	# 实例化 Spreadsheet 对象
	$spreadsheet = new Spreadsheet();
	# 获取活动工作薄
	$sheet = $spreadsheet->getActiveSheet();

	$sheet->setCellValue('A1','商品标题');
	$sheet->setCellValue('B1','一级分类');
	$sheet->setCellValue('C1','二级分类');
	$sheet->setCellValue('D1','进货价');
	$sheet->setCellValue('E1','图片');

	$data = [
		'云朵般轻盈的仙女裙 高级钉珠收腰长裙 气质无袖连衣裙',
		'女装',
		'连衣裙',
		279.99,
		'https://gd3.alicdn.com/imgextra/i3/266969832/O1CN01PWUBBB2MV6ekBKtb6_!!266969832.jpg_400x400.jpg',
	];
	$sheet->fromArray(
		$data,
		null,
		'A2'
	);

	// MIME 协议,文件的类型,不设置,会默认html
	header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
	// MIME 协议的扩展
	header('Content-Disposition:attachment;filename=商品列表示例.xlsx');
	// 缓存控制
	header('Cache-Control:max-age=0');

	$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
	// php://output 它是一个只写数据流, 允许你以 print 和 echo一样的方式写入到输出缓冲区。 
	$writer->save('php://output');

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 异常处理实现代码
Mar 10 PHP
PHP 翻页 实例代码
Aug 07 PHP
hessian 在PHP中的使用介绍
Dec 13 PHP
PHP中extract()函数的定义和用法
Aug 17 PHP
table标签的结构与合并单元格的实现方法
Jul 24 PHP
php按单词截取字符串的方法
Apr 07 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
Mar 29 PHP
php.ini中date.timezone设置详解
Nov 20 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
java解析json方法总结
May 16 PHP
php字符串函数 str类常见用法示例
May 15 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 #PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 #PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 #PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 #PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 #PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
You might like
PHP 读取文件内容代码(txt,js等)
2009/12/06 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
浅谈Angular 观察者模式理解
2018/11/01 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
python使用心得之获得github代码库列表
2014/06/25 Python
跟老齐学Python之dict()的操作方法
2014/09/24 Python
Python3中使用PyMongo的方法详解
2017/07/28 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
Python3 元组tuple入门基础
2020/02/09 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
维德科技C#面试题笔试题
2015/12/09 面试题
高校自主招生自荐信
2013/12/09 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
寒假生活随笔
2015/08/15 职场文书
Elasticsearch 批量操作
2022/04/19 Python
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android