如何使用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("拾码者"); //分类