如何使用PhpOffice/PhpSpreadsheet对Excel进行读取导入和写入导出操作?

2024-04-17 PHP案例 505 WGE

phpOffice/PhpSpreadsheet是一个使用纯PHP语言编写的组件库,对比PHPExcel来说,他的代码质量、性能会脱颖而出,对于不再维护的PHPExcel来说完全可以取代。

我们可以使用PhpSpreadsheet轻松读取和写入Excel文档,支持Excel的所有操作。

对于刚刚接触的朋友来说,是比较困难的,而且目前来说他没有中文文档。

一、安装phpOffice/PhpSpreadsheet

软件依赖:

使用PhpSpreadsheet必须满足以下条件

1.PHP5.6或更改版本,推荐PHP7
2.支持php_zip扩展
3.支持php_xml扩展
4.支持php_gd2扩展

使用Composer安装

composer require phpoffice/phpspreadsheet

二、导入读取Excel

require 'vendor/autoload.php';

$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load('userxlsx'); //载入excel表格

$worksheet = $spreadsheet->getActiveSheet();

$rows = $worksheet->getHighestRow(); // 总行数
$column = $worksheet->getHighestColumn(); // 总列数

$user
for($i = 1; $i <= $rows; $i++) {
        $temp = [];
        $temp['name'] = $sheet->getCell('A' . $i)->getValue();
        $temp['sex'] = $sheet->getCell('B' . $i)->getValue();
        $temp['age'] = $sheet->getCell('C' . $i)->getValue();
        # 防止空行情况
        if (!$temp['name']) {
            continue;
        }
        $users[] = $temp;
}

三、导出Excel

require 'vendor/autoload.php';
 
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 
$spreadsheet = new Spreadsheet();

$sheet = $spreadsheet->getActiveSheet();
//设置工作表标题名称
$sheet->setTitle('学生成绩表');

//表头
//设置单元格内容
$sheet->setCellValueByColumnAndRow(1, 1, '姓名');
$sheet->setCellValueByColumnAndRow(2, 1, '语文');
$sheet->setCellValueByColumnAndRow(3, 1, '数学');
$sheet->setCellValueByColumnAndRow(4, 1, '外语');
$sheet->setCellValueByColumnAndRow(5, 1, '总分');

// 获取数据库内容
$arr = [];

foreach($arr as $k => $v){
	$sheet->setCellValueByColumnAndRow(1, $k+2, $v['name']);
	$sheet->setCellValueByColumnAndRow(1, $k+2, $v['chinese']);
	$sheet->setCellValueByColumnAndRow(1, $k+2, $v['maths']);
	$sheet->setCellValueByColumnAndRow(1, $k+2, $v['english']);
	$sheet->setCellValueByColumnAndRow(1, $k+2, $v['sum']);
}

$filename = '成绩表.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');
 
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');

四、其他设置说明

内容区域设置

// 单个单元格
$sheet->getStyle('A1')
// 区域
$sheet->getStyle('A1:E1')

设置内容:setCellValueByColumnAndRow(列, 行, 值)

$sheet->setCellValueByColumnAndRow(1, 1, '我们');

设置换行符

// 使用\n进行换行
$sheet->getCell('A1')->setValue("Hello\nWorld");
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);

设置字体、加粗、字体大小

// 将单元格A1设置为Arial字体、加粗、20号字体大小
$sheet->getStyle('A1')->getFont()->setName('Arial')->setBold(true)->setSize(20);

设置字体颜色

// setARGB中前两位为FF,后面为颜色的6位值
$sheet->getStyle('A2:E2')->getFont()->getColor()->setARGB('FF0080FF');

设置文字垂直居中、水平居中

$styleArray = [
    'alignment' => [
        'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
        'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
    ],
];
$sheet->getStyle('A1')->applyFromArray($styleArray); 

设置背景颜色

$worksheet->getStyle('A2:E2')->getFill()
    ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
    ->getStartColor()
    ->setARGB('FFCCFFCC');

设置列宽

// 设置默认列宽
$sheet->getDefaultColumnDimension()->setWidth(20);
// 自动计算列宽
$sheet->getColumnDimension('B')->setAutoSize(true); 
// 单独设置列宽
$sheet->getColumnDimension('A')->setWidth(30);

设置行高

// 设置默认行高
$sheet->getDefaultRowDimension()->setRowHeight(100);
// 单独设置行高
$sheet->getRowDimension('1')->setRowHeight(80);

设置超链接

$sheet->setCellValue('E6', 'www.wge68.com');
$sheet->getCell('E6')->getHyperlink()->setUrl('https://www.wge68.com');

使用函数

$sheet->setCellValue('B3', '=SUM(B1:C2)');

插入图片

use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

$drawing = new Drawing();
$drawing->setName('Logo');
$drawing->setDescription('Logo');
$drawing->setPath('export/logo.png');
$drawing->setWidth(80); // 图片宽度
$drawing->setHeight(36); // 图片高度
$drawing->setCoordinates('A1'); // 单元格坐标
$drawing->setOffsetX(10); // X轴偏移
$drawing->setOffsetY(10); // Y轴偏移
$drawing->setWorksheet($sheet); // 将图片关联到工作表

设置文档属性

$spreadsheet->getProperties()
    ->setCreator("WGE拾码者")    //作者
    ->setLastModifiedBy("WGE") //最后修改者
    ->setTitle("WGE拾码者个人博客")  //标题
    ->setSubject("https://www.wge68.com") //副标题
    ->setDescription("代码撬动世界")  //描述
    ->setKeywords("WGE") //关键字
    ->setCategory("拾码者"); //分类