当前位置: 首页 > news >正文

PhpOffice/PhpSpreadsheet读取和写入Excel

PhpSpreadsheet是一个纯PHP编写的组件库,它使用现代PHP写法,代码质量和性能比PHPExcel高不少,完全可以替代PHPExcel(PHPExcel已不再维护)。使用PhpSpreadsheet可以轻松读取和写入Excel文档,支持Excel的所有操作。

1. 初识PhpSpreadsheet

软件依赖

要使用PhpSpreadsheet需要满足以下条件:

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

安装

现在开始,创建项目目录/PHPExcel,进入项目目录。

使用composer安装:

composer require phpoffice/phpspreadsheet

使用

在项目目录下新建/public目录,在public目录下创建示例文件test.php,编辑test.php,用以下代码。

<?phprequire '../vendor/autoload.php';use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();$sheet->setCellValue('A1', 'Welcome to Helloweba.');$writer = new Xlsx($spreadsheet);$writer->save('hello.xlsx');

运行代码,你会发现在目录下生成一个hello.xlsx文件,打开Excel文件,你会看到Excel中的单元格A1中有“Welcome to Helloweba.”内容。当然你可以对单元格样式诸如颜色、背景、宽度、字体等等进行设置,这些会在接下来的几节中讲到。
PhpSpreadsheet特性

支持读取.xls,.xlsx,.html,.csv等格式文件,支持写入导出.xls,.xlsx,.html,.csv,.pdf格式文件。
提供丰富的API,提供单元格样式设置、Excel表格属性设置、图表设置等等诸多功能。使用PhpSpreadsheet完全可以生成一个外观结构都满足你的Excel表格文件。
卓越的性能,尤其在PHP7上表现优异,比PHPExcel强大很多。

2. 使用PhpSpreadsheet将Excel导入到MySQL数据库

导入Excel

思路:使用PhpSpreadsheet读取Excel表格中的有用信息,然后组装成sql语句,最后批量插入到MySQL表中。

  require 'vendor/autoload.php';include('conn.php'); //连接数据库$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');$reader->setReadDataOnly(TRUE);$spreadsheet = $reader->load('students.xlsx'); //载入excel表格$worksheet = $spreadsheet->getActiveSheet();$highestRow = $worksheet->getHighestRow(); // 总行数$highestColumn = $worksheet->getHighestColumn(); // 总列数$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5$lines = $highestRow - 2;if ($lines <= 0) {exit('Excel表格中没有数据');}$sql = "INSERT INTO `t_student` (`name`, `chinese`, `maths`, `english`) VALUES ";for ($row = 3; $row <= $highestRow; ++$row) {$name = $worksheet->getCellByColumnAndRow(1, $row)->getValue(); //姓名$chinese = $worksheet->getCellByColumnAndRow(2, $row)->getValue(); //语文$maths = $worksheet->getCellByColumnAndRow(3, $row)->getValue(); //数学$english = $worksheet->getCellByColumnAndRow(4, $row)->getValue(); //外语$sql .= "('$name','$chinese','$maths','$english'),";}$sql = rtrim($sql, ","); //去掉最后一个,号try {$db->query($sql);echo 'OK';} catch (Exception $e) {echo $e->getMessage();}

3. 使用PhpSpreadsheet将数据导出为Excel文件

一、设置表头

首先我们引入自动加载PhpSpreadsheet库,然后实例化,设置工作表标题名称为:学生成绩表,接着设置表头内容。表头分为两行,第一行是表格的名称,第二行数表格列名称。最后我们将第一行单元格进行合并,并设置表头内容样式:字体、对齐方式等。

require 'vendor/autoload.php';use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;include('conn.php'); //连接数据库$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
//设置工作表标题名称
$worksheet->setTitle('学生成绩表');//表头
//设置单元格内容
$worksheet->setCellValueByColumnAndRow(1, 1, '学生成绩表');
$worksheet->setCellValueByColumnAndRow(1, 2, '姓名');
$worksheet->setCellValueByColumnAndRow(2, 2, '语文');
$worksheet->setCellValueByColumnAndRow(3, 2, '数学');
$worksheet->setCellValueByColumnAndRow(4, 2, '外语');
$worksheet->setCellValueByColumnAndRow(5, 2, '总分');//合并单元格
$worksheet->mergeCells('A1:E1');$styleArray = ['font' => ['bold' => true],'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,],
];
//设置单元格样式
$worksheet->getStyle('A1')->applyFromArray($styleArray)->getFont()->setSize(28);$worksheet->getStyle('A2:E2')->applyFromArray($styleArray)->getFont()->setSize(14);

二、读取数据

我们连接数据库后,直接读取学生成绩表t_student,然后for循环,设置每个单元格对应的内容,计算总成绩。注意的是表格中的数据是从第3行开始,因为第1,2行是表头占用了。

然后,我们设置整个表格样式,给表格加上边框,并且居中对齐。

  $sql = "SELECT id,name,chinese,maths,english FROM `t_student`";$stmt = $db->query($sql);$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);$len = count($rows);$j = 0;for ($i=0; $i < $len; $i++) {$j = $i + 3; //从表格第3行开始$worksheet->setCellValueByColumnAndRow(1, $j, $rows[$i]['name']);$worksheet->setCellValueByColumnAndRow(2, $j, $rows[$i]['chinese']);$worksheet->setCellValueByColumnAndRow(3, $j, $rows[$i]['maths']);$worksheet->setCellValueByColumnAndRow(4, $j, $rows[$i]['english']);$worksheet->setCellValueByColumnAndRow(5, $j, $rows[$i]['chinese'] + $rows[$i]['maths'] + $rows[$i]['english']);}$styleArrayBody = ['borders' => ['allBorders' => ['borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,'color' => ['argb' => '666666'],],],'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,],];$total_rows = $len + 2;//添加所有边框/居中$worksheet->getStyle('A1:E'.$total_rows)->applyFromArray($styleArrayBody);

三、下载保存

强制浏览器下载数据并保存为Excel文件

$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');

如想要保存为.xls文件格式的话,可以改下header代码:

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

4. 详解PhpSpreadsheet设置单元格

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

use PhpOffice\PhpSpreadsheet\Spreadsheet;$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();

字体

第1行代码将A7至B7两单元格设置为粗体字,Arial字体,10号字;第2行代码将B1单元格设置为粗体字。

$spreadsheet->getActiveSheet()->getStyle('A7:B7')->getFont()->setBold(true)->setName('Arial')->setSize(10);;
$spreadsheet->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);

将文字颜色设置为红色

$spreadsheet->getActiveSheet()->getStyle('A4')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);

图片

可以将图片加载到Excel中

$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('Logo');
$drawing->setDescription('Logo');
$drawing->setPath('./images/officelogo.jpg');
$drawing->setHeight(36);

列宽

将A列宽度设置为30(字符):

$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(30);

如果需要自动计算列宽,可以这样:

$spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true); 

设置默认列宽为12:

$spreadsheet->getActiveSheet()->getDefaultColumnDimension()->setWidth(12);

行高

设置第10行行高为100pt:

$spreadsheet->getActiveSheet()->getRowDimension('10')->setRowHeight(100);

设置默认行高:

$spreadsheet->getActiveSheet()->getDefaultRowDimension()->setRowHeight(15); 

对齐

将A1单元格设置为水平居中对齐:

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

合并

将A18到E22合并为一个单元格:

$spreadsheet->getActiveSheet()->mergeCells('A18:E22');

拆分

将合并后的单元格拆分:

$spreadsheet->getActiveSheet()->unmergeCells('A18:E22');

边框

将B2至G8的区域添加红色边框:

$styleArray = ['borders' => ['outline' => ['borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,'color' => ['argb' => 'FFFF0000'],],],
];
$worksheet->getStyle('B2:G8')->applyFromArray($styleArray);

工作表标题

设置当前工作表标题:

$spreadsheet->getActiveSheet()->setTitle('Hello'); 

日期时间

设置日期格式:

$spreadsheet->getActiveSheet()->setCellValue('D1', '2018-06-15');$spreadsheet->getActiveSheet()->getStyle('D1')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDD2);

换行

使用\n进行单元格内换行,相当于(ALT+“Enter”):

$spreadsheet->getActiveSheet()->getCell('A4')->setValue("hello\nworld");
$spreadsheet->getActiveSheet()->getStyle('A4')->getAlignment()->setWrapText(true)

超链接

将单元格设置为超链接形式:

$spreadsheet->getActiveSheet()->setCellValue('E6', 'www.helloweba.net');
$spreadsheet->getActiveSheet()->getCell('E6')->getHyperlink()->setUrl('https://www.helloweba.net');

使用函数

使用SUM计算B5到C5之间单元格的总和。其他函数同理:最大数(MAX),最小数(MIN),平均值(AVERAGE):

$spreadsheet->getActiveSheet()->setCellValue('B7', '=SUM(B5:C5)');

设置文档属性

可以设置Excel文档属性:

  $spreadsheet->getProperties()->setCreator("Helloweba")    //作者->setLastModifiedBy("Yuegg") //最后修改者->setTitle("Office 2007 XLSX Test Document")  //标题->setSubject("Office 2007 XLSX Test Document") //副标题->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")  //描述->setKeywords("office 2007 openxml php") //关键字->setCategory("Test result file"); //分类

此外,除了提供丰富的Excel文件处理接口外,PhpSpreadshee还提供了CSV,PDF,HTML以及XML等文件处理接口。

相关文章:

PhpOffice/PhpSpreadsheet读取和写入Excel

PhpSpreadsheet是一个纯PHP编写的组件库&#xff0c;它使用现代PHP写法&#xff0c;代码质量和性能比PHPExcel高不少&#xff0c;完全可以替代PHPExcel&#xff08;PHPExcel已不再维护&#xff09;。使用PhpSpreadsheet可以轻松读取和写入Excel文档&#xff0c;支持Excel的所有…...

jenkins自动化部署Jenkinsfile文件配置

简介 使用jenkins部署时会读取项目中Jenkinsfile文件&#xff0c;文件配置不对会导致部署失败 文件内容 pipeline {agent anyparameters {string(name: project_name, defaultValue: xxx1, description: 项目jar名称)string(name: version, defaultValue: xxx2, description…...

【socket编程简述】TCP UDP 通信总结、TCP连接的三次握手、TCP断开的四次挥手

Socket&#xff1a;Socket被称做 套接字&#xff0c;是网络通信中的一种约定。 Socket编程的应用无处不在&#xff0c;我们平时用的QQ、微信、浏览器等程序.都与Socket编程有关。 三次握手 四次断开 面试可…...

多线程-死锁

/*** 死锁demo*/ public class DeadlockDemo {public static void main(String[] args) {// 创建两个对象final Object resource1 "resource1";final Object resource2 "resource2";// 创建第一个线程Thread t1 new Thread(() -> {// 尝试锁定resour…...

P1006 [NOIP2008 提高组] 传纸条

P1006 [NOIP2008 提高组] 传纸条 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路四维dp三维dp AC四维代码&#xff1a;AC三维代码&#xff1a; 题目描述 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。一次素质拓展活动中&#…...

杭电比赛总结

我们的队伍&#xff1a;team013 另外两队&#xff1a;team014、team015 ​ 今天是我第一次打杭电&#xff0c;发现杭电多数都是猜结论题 先给一下我们的提交数据 Submit TimeProblem IDTimeMemoryJudge Status4:59:59101115 MS1692 KWrong Answer4:59:55101115 MS1684 KWrong…...

dom靶场

靶场下载地址&#xff1a; https://www.vulnhub.com/entry/domdom-1,328/ 一、信息收集 获取主机ip nmap -sP 192.168.16.0/24netdiscover -r 192.168.16.0/24端口版本获取 nmap -sV -sC -A -p 1-65535 192.168.16.209开放端口只有80 目录扫描 这里扫描php后缀的文件 g…...

go struct 的常见问题

go struct 的常见问题 1. 什么是struct&#xff1f;2. 如何声明、定义和创建一个struct&#xff1f;3. struct和其他数据类型&#xff08;如数组、切片、map等&#xff09;有什么区别&#xff1f;4. 如何访问struct字段&#xff1f;5. struct是否支持继承&#xff0c;是否支持重…...

Linux系统下的性能分析命令

在 Linux 系统下&#xff0c;有许多用于性能分析和调试的命令和工具&#xff0c;可以帮助您识别系统瓶颈、优化性能以及调查问题。本文将介绍在性能分析过程中&#xff0c;可能使用到的一些命令。 以下是一些常用的性能分析命令和工具汇总&#xff1a; 命令功能简述top用于实…...

第十三课:QtCmd 命令行终端应用程序开发

功能描述&#xff1a;开发一个类似于 Windows 命令行提示符或 Linux 命令行终端的应用程序 一、最终演示效果 QtCmd 不是因为它是 Qt 的组件&#xff0c;而是采用 Qt 开发了一个类似 Windows 命令提示符或者 Linux 命令行终端的应用程序&#xff0c;故取名为 QtCmd。 上述演示…...

Jmeter进阶使用:BeanShell实现接口前置和后置操作

一、背景 我们使用Jmeter做压力测试或者接口测试时&#xff0c;除了最简单的直接对接口发起请求&#xff0c;很多时候需要对接口进行一些前置操作&#xff1a;比如提前生成测试数据&#xff0c;以及一些后置操作&#xff1a;比如提取接口响应内容中的某个字段的值。举个最常用…...

【知识分享】高防服务器的防御机制

【知识分享】高防服务器的防御机制 易受到攻击的网站选择接入高防服务更安全&#xff0c;大家对于这个都清楚!但是对于高防服务如何实现防御来保障安全的&#xff0c;又了解多少呢?今天壹基比小源&#xff08;贰伍壹叁壹叁壹贰玖捌&#xff09;就来说说高防服务实现防御的常规…...

内网穿透-外远程连接中的RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…...

驱动DAY4 字符设备驱动分步注册和ioctl函数点亮LED灯

头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X50007000 #d…...

Python爬虫——scrapy_当当网图书管道封装

创建爬虫项目 srcapy startproject scrapy_dangdang进入到spider文件里创建爬虫文件&#xff08;这里爬取的是青春文学&#xff0c;仙侠玄幻分类&#xff09; srcapy genspider dang http://category.dangdang.com/cp01.01.07.00.00.00.html获取图片、名字和价格 # 所有的se…...

Linux下如何修改CPU 电源工作模式

最近处理一起历史遗留问题&#xff0c;感觉很爽。 现象&#xff1a; 背景&#xff1a;设备采用ARM&#xff0c;即rk3568处理器&#xff0c;采用Linux系统&#xff1b;主要用于视觉后端处理 现象&#xff1a;当软件运行一段时间&#xff0c;大概1个小时&#xff08;也不是很固定…...

Effective C++学习笔记(8)

目录 条款49&#xff1a;了解new-handler的行为条款50&#xff1a;了解new和delete的合理替换时机条款51&#xff1a;编写new和delete时需固守常规条款52&#xff1a;写了placement new也要写placement delete条款53&#xff1a;不要轻忽编译器的警告条款54&#xff1a;让自己熟…...

学校如何公布录取情况表?这个不用技术的方法,小白老师都能轻松制作

作为一名教师&#xff0c;我深切了解学生和家长们对录取情况的关注和重视。为了满足他们的需求&#xff0c;我们学校一直致力于改进公布录取情况的方式和效果。在本篇文章中&#xff0c;我将向您介绍我们学校独特的录取查询系统&#xff0c;并分享我们选择这种方式的原因。 我…...

Chart GPT免费可用地址共享资源

GPT4.0&#xff1a; https://gpt4e.ninvfeng.xyz github:https://github.com/ninvfeng/chatgpt4 WeUseAi&#xff1a;https://chatb.weuseai.pro AI.LS&#xff1a;https://n7.gpt03.xyz ChatX (iOS/macOS应用)&#xff1a;https://itunes.apple.com/app/id6446304087 ch…...

设计模式十八:中介者模式(Mediator Pattern)

在中介者模式中&#xff0c;多个对象之间不再直接相互通信&#xff0c;而是通过一个中介者对象进行通信。这可以减少对象之间的依赖关系&#xff0c;使系统更加模块化。中介者模式适用于当对象之间的通信逻辑变得复杂&#xff0c;导致代码难以维护和理解时。 中介者模式使用场…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...