php使用PhpSpreadsheet导出Excel表格详解

news2024/9/27 7:24:50

本文会介绍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 对象
$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('姓名'); // 设置A1单元格的值为姓名
// 给A1设置值,参数:单元格位置,值
$sheet->setCellValue('A1','ID');

//给A2赋值 hello
$sheet->setCellValueByColumnAndRow(1, 2, 'hello');

3、单元格文字样式

  • getStyle 获取单元格样式
  • getFont 获取单元格文字样式
  • setBold 设置文字粗细
  • setName 设置文字字体
  • setSize 设置文字大小
//将A1至D1单元格设置成粗体
$sheet->getStyle('A1:D1')->getFont()->setBold(true);
//将A1单元格设置成粗体,黑体,10号字
$sheet->getStyle('A1')->getFont()->setBold(true)->setName('黑体')->setSize(10);

4、单元格文字颜色

  • getColor() 获取坐标颜色
  • setRGB() 设置字体颜色(颜色值带#)
  • getRGB() 获取字体颜色
  • setARGB() 设置字体颜色(颜色值不带#)
  • getARGB() 获取字体颜色
// B3单元格设置颜色
$sheet->getStyle('B3')->getFont()->getColor()->setRGB('#AEEEEE');
$sheet->getStyle('B3')->getFont()->getColor()->setARGB('FFFF0000');

5、单元格内文字换行

  • setWrapText 设置文本里的\n符合为:换行
//使用 \n 进行单元格内换行,相当于 Alt+Enter
$sheet->getCell('A1')->setValue("hello\nworld");
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);

6、单元格列和行

  • getColumnDimension 获取一列
  • getWidth 获取一列的宽度
  • setWidth 设置一列的宽度
  • setAutoSize 设置一列的宽度自动调整
  • getDefaultColumnDimension 获取一列的默认值
//设置默认列宽20
$sheet->getDefaultColumnDimension()->setWidth(20);

//将A列宽度设置成20
$sheet->getColumnDimension('A')->setWidth(20);

//自动计算列宽
$sheet->getColumnDimension('A')->setAutoSize(true);
  • getRowDimension 获取一行
  • getRowHeight 获取一行的高度
  • setRowHeight 设置一行的高度
//设置默认行高
$sheet->getDefaultRowDimension()->setRowHeight(20);

//设置第一行行高为20pt
$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;
// 外边框
// Border 类中的常量都是边框样式
// Border::BORDER_THICK 边框样式
$styleArray = [
    'borders' => [
        'outline' => [
            'borderStyle' => Border::BORDER_THICK,
            'color' => ['argb' => 'FFFF0000'],
        ],
    ],
];
$worksheet->getStyle('B2:G8')->applyFromArray($styleArray);

8、单元格合并和拆分

  • mergeCells 合并
  • unmergeCells 拆分
// 合并A1到C1列
$sheet->mergeCells('A1:C4');
// 合并A1到A4行
$sheet->mergeCells('A1:A4');
// 合并后,赋值只能给A1,开始的坐标。
$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、批量赋值

  • fromArray 从数组中的值填充工作表

参数1:数据(数组)
参数2:去除某个值
参数3:从哪个位置开始

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

工作簿操作

1、xlsx 文件导出

  • IOFactory::createWriter 写入到文件
use PhpOffice\PhpSpreadsheet\IOFactory;
// MIME 协议,文件的类型,不设置,会默认html
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
// MIME 协议的扩展
$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 文件导出

// MIME 协议,文件的类型,不设置,会默认html
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
// MIME 协议的扩展
$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、设置工作簿标题

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jetson查CPU/GPU等的占用情况——jtop的安装和使用

Jtop的安装 (1) 安装JTOP查看可查CPU等的占用情况 sudo apt-get updatesudo apt-get full-upgradesudo apt install curlsudo apt install nanocurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py #下载安装脚本sudo python3 get-pip.py # 运行安装脚本sudo pip3 insta…

0401锁详解-MySQL-数据库

1 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的问题&#x…

解决QtCreator安卓平台原生C++代码无法输出日志问题

1.需求,因原生C++调用std::cout ,std::cerr,及C函数prinf输出要显示在控制台, 问题: 在QtCreator中只看到qDebug输的日志,并没有看到 cout,cerr,printf的输出日志 2.最终已解决如下 在QtCreator中显示了C++原生日志 在Android Studio 的Logcat中显示了C++原生日志 模拟器 …

c++11 标准模板(STL)(std::basic_ostream)(三)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

印刷企业WMS仓储管理系统解决方案

在数字化转型的浪潮中&#xff0c;印刷企业也积极寻求适合自身发展的解决方案。作为印刷业的重要环节&#xff0c;仓储管理对于提高效率、降低成本至关重要。而印刷企业WMS仓储管理系统的应用&#xff0c;为印刷企业带来了全新的解决方案。 印刷WMS仓储管理系统是一种基于信息技…

简单认识Tomcat的部署和优化

文章目录 一、简单认识Tomcat1、简介2、构成3、Tomcat 功能组件结构4、Tomcat 请求过程&#xff1a; 二、Tomcat部署1.关闭防火墙&#xff0c;将安装 Tomcat 所需软件包传到/opt目录下2.安装JDK3.设置JDK环境变量4.测试java环境5.安装Tomcat6.启动和关闭Tomcat7.优化 tomcat 启…

synchronized锁升级以后会再降级吗?

Java对象头Markword的结构 其中&#xff0c;最低2位是10代表重量级锁&#xff0c;00代表轻量级锁&#xff0c;001代表无锁&#xff0c;101代表偏向锁。 synchronized锁在1.6的时候做了优化&#xff0c;当仅有一个线程竞争锁的时候&#xff0c;锁处于偏向锁的状态&#xff0c;当…

bim技术的发展趋势是哪些方向?

BIM在现阶段已经取得了较高的发展水平。尽管BIM在许多方面取得了显著进展&#xff0c;但仍有继续改进和发展的空间。未来&#xff0c;BIM在数字化转型、智能化应用和全生命周期管理方面的进一步推进将成为发展重点。简单聊聊BIM技术的发展趋势包括以下几个方向&#xff1a; BIM…

Java面试通关:阿里内部实战模拟面试精讲题库,竟被上传GitHub!

其实这些技术在真正的实际开发环境中真的用得到吗&#xff1f;不一定的&#xff0c;但是没办法&#xff0c;环境就是如此&#xff0c;能做的也就只有不断提升自己&#xff0c;去适应市场环境&#xff0c;提高自身技术水平&#xff01; 我的建议&#xff0c;不管自己现在是个什…

2021北大生命科学院饶毅教授毕业致辞

在祝福裹挟着告诫呼啸而来的毕业季&#xff0c;请原谅我&#xff0c;不敢祝愿每一位毕业生都成功都幸福。因为历史不幸的记载着有人的成功&#xff0c;代价是丧失良知&#xff0c;有人的幸福&#xff0c;代价是损害他人。 从物理学来说&#xff0c;无机的原子&#xff0c;逆​热…

Loadrunner怎么实现MD5加密

目录 前言&#xff1a; 1、写一个md5.h文件&#xff0c;将其放入脚本路径下 2、在globals.h中加入#include “md5.h” 3、在Action中写脚本&#xff0c;脚本示例如下&#xff1a; 前言&#xff1a; 在 LoadRunner 中实现 MD5 加密可以通过使用 LoadRunner 提供的函数来完成…

Redis发布订阅的通讯模式

这个是非常简单的,我们只需要打开两个redis就可以轻松完成 通过Xshell工具两次连接linux,同时启动两个redis: 在第一个里面进行订阅: subscribe leq 在第二个里面进行发布: publish leq hello 这样就可以在订阅的里头看到刚刚发布的信息,没看之前订阅那块也会有提示

带纵深可跳跃横版闯关游戏模版

此项目是以《卡比猎人队》为蓝本开发的横版带纵深闯关游戏模版。内涵数据表配置文件。 购买链接&#xff1a; 微店购买链接 开发环境 开发引擎&#xff1a;CocosCreator3.6.3开发语言&#xff1a;TypeScript 包含的内容&#xff1a; 逻辑实现目录介绍&#xff08;game&am…

Visdom使用

Visdom Visdom是一个面向科学研究的可视化工具&#xff0c;可以帮助你可视化和理解数据。它是 Facebook Research 开发的一个基于 Python 的可视化库&#xff0c;可以在Web浏览器中实时显示和更新图表、图像、文本等各种数据。 1 安装Visdom 可以使用以下命令安装Visdom&…

海思平台图像的IQ调试

目录 1.何为ISP何为IQ调试 1.1、ISP概念 1.2、在哪里做ISP 1.3、何为IQ 1.4、总结 2.海思MPP中ISP的实现框架 2.1、官方文档 2.2、sample中ISP相关部分 2.3、sensor注册内部细节 2.4、ISP注册内部细节 3.IQ调试相关的概念 3.1、黑电平 3.2、镜头阴影矫正 3.3、坏点…

《移动互联网技术》第十一章 Android应用工程案例: 掌握Android系统的需求分析和设计以及 Android项目的程序测试和版本管理方法

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

1208道Java面试题(2023突击版),覆盖互联网大厂核心知识点

Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。…

需求分析引言:架构漫谈(三)可用性专题

前文介绍了非功能性需求的各个指标和一些业界的标准。 非功能性需求里有一项可靠性&#xff0c;与之关联的一个指标叫可用性 本文对非功能性需求里的可用性、可靠性&#xff0c;进行一些详细的说明。 概念 我们在网上的云服务商处&#xff0c;经常看到产品介绍里会有这种字样…

Redis【实战篇】---- 分布式锁-redission

Redis【实战篇】---- 分布式锁-redission 1. 分布式锁-redission功能介绍2. 分布式锁-redission快捷入门3. 分布式锁-redission可重入锁原理4. 分布式锁-redission锁重试和WatchDog机制5. 分布式锁-redission锁的MutiLock原理 1. 分布式锁-redission功能介绍 基于setnx实现的分…

【AcWing算法基础课】第一章 基础算法(部分待更)

文章目录 前言课前温习一、快速排序核心模板1.1题目描述1.2思路分析1.3代码实现 二、归并排序核心模板2.1题目描述2.2思路分析2.3代码实现 三、二分查找整数二分题目一3.1题目描述3.2思路分析3.3代码实现 浮点数二分题目二3.1题目描述3.2思路分析3.3代码实现 四、高精度加法核心…