使用phpspreadsheet插件导出Excel
当你查看到我这篇文章的时候,我知道你正在面临一个需求,在项目中实现将数据导成Excel文件,如果你正是有这方面需求,那请你继续看下去,我会轻松简单的教会你如何实现需求。因为对比网络其它技术文章和网络来讲,看起来很枯燥,要花时间研究,对于一些缺“胳膊少腿”的文章更是绞尽脑汁,所以呢,为了弥补其它博客和技术文章的缺陷,我在这里会按照步骤,一步一步的教会你,手把手的教学方式,你会感觉你很轻松的就完成了你的任务,当然,如果你是深度研究,可能不适合您阅读,本文只适合想快速实现自己需求,如此简单!本文章分为2个模块,第一是前言,您在做这个功能还是有必要了解的,第二是,手把手教你导出Excel。下面让我们正式开始:
一、了解
1、目前有phpExcel和phpspreadsheet以及框架中自带封装的导出Excel类,我这里将会教你使用phpspreadsheet插件完成你的导出,首先说明,为什么要使用phpspreadsheet完成,有什么好处?
答:
①因为phpExcel在2015年已经停止更新,官方已经强烈建议,不要在使用,官方都说话了,而且2015年距离2020年已经好几年了,所以即便这个插件能实现,对于现在学习的你,干嘛学一个已经过时好久的插件呢,对吧。
②在很多框架中,比如laravel中封装的导出Excel类,虽然很新颖,可以实现导出,但是你要知道它毕竟属于laravel框架的插件,如果你将来离职了,也就是解耦性太差,去了其它公司用了其它的框架,那么这个插件你就用不了啦,所以我们要学肯定用一个能通吃所有框架的插件啦。
③phpspreadsheet插件其实是phpExcel升级版,功能相当强大,可以用excel表画图,别提导出小小数据啦,而且相比较phpExcel可是纯php开发,是php亲生的呢,而且适合用于任何框架,移植性比较好
二、手把手实现Excel导出
当你看这篇文章我就默认,就默认你是有一些php基础的,其实大概的原理,就是整一个插件放在项目中,插件本质就是你平时写的一个类文件,一个脚本,软后require引用或者psr4引入,引入进来之后,实例化,根据这个插件中封装的方法,调用方法一步步实现excel数据的整合,下载等等。好,接下来,让我们开始;
第一步:安装
安装执行指令:composer require phpoffice/phpspreadsheet
该指令由官方提供,绝对正版,直接打卡你项目的命令行,执行即可,如果是phpstorm软件,在自带的命令行中执行即可,如果没有,在你的项目根目录打开cmd执行即可。
这个指令比较智能,如果你是TP、laravel等框架,他会自动帮你composer安装好指定框架位置,并且注册自动加载;
我举个例子给你们看,安装好是咋样的
Laravel中:
其它的框架也是大致的差不多;
第二步:引用
安装好了,自然就是要引用到你的项目中了,主要看你引用在哪个文件,通常在项目中引入到你的公共父类或者自己指定的类中使用;
(图片中的文字注意查看)
该插件引用只能通过命名空间方式引用,如果你的项目中没有psr4这种功能,采用的是最基本的require、include等方式进行引用,不用担心,这个插件自带了psr4功能;如果你的项目中不具备psr4直接引用会报错的,那么你需要引用插件中的自动加载了,在引入上图中的导出类。
require "vendor/autoload.php";
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
第三步:使用
文件都引入进来了,下面就是使用了,为了确保上图中的两个文件以及引入,你可以打印一下,看看是不是类,确保上述流程以及正确。
如果正确了,接下来,就是使用引入类中的方法,我简单介绍一下类中的方法都是干啥的,让你心里有个底;
①有个方法,是选择excel的tab的
②有个方法操作将数据库写入到单元格中的
③有个方法是批量将二维数组一条条写入到excel中的
④有个方法是设置字体样式的
⑤有个方法是设置单元样式
还有很多...,当然你不需要那么多;上面讲的这些涉及到很多方法只是介绍,我放在最后一个环节,我已经给你封装好了,请你拿来就用;
1、保证上述的文件引入(我下面在放一份,没有引用的,复制放到你的文件中)
require "vendor/autoload.php";(这个文件,如果有自动加载的框架,不要引入)
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
2、我已经将上述的两个类相关导出的功能都封装到方法中了,请把我的这个方法,放到你的文件中,我这个方法是类中的方法,不是一个单独的函数,当然你可以将它改造成函数,一样可以使用的。
2、
* 对Spreadsheet方法封装(锐庆)
* @param array $arr 该数组必须为键值对,键是表格单元,值是单元格的值
* @param array $data 该数组如果为一维数组,则填写一行,如果为二维数组,则多行数据
* @param string $name 下载Excel的文件名,可忽略
* @param string $type 选择文件类型,如果不填写,默认下载为xlsx格式,如果任意填写数值为xls格式
* @param int $with 设置sheet默认列宽
public function downloadExcel(array $arr,array $data,$name="",$type="Xlsx"){
//文件名处置
if(empty($name)){
$name=date("Y-m-d H:i:s")."_".rand(1000,9999);
}else{
$name = $name."_".date("Y-m-d H:i:s");
//内容设置
$preadsheet = new Spreadsheet();
$sheet = $preadsheet->getActiveSheet();
foreach($arr as $k=>$v){
$sheet->setCellValue($k,$v);
$sheet->fromArray($data,null,"A2");
//样式设置
$sheet->getDefaultColumnDimension()->setWidth(12);
//设置下载与后缀
if($type=="Xlsx"){
header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
$suffix = "xlsx";
}else{
header("Content-Type:application/vnd.ms-excel");
$type = "Xls";
$suffix = "xls";
header("Content-Disposition:attachment;filename=$name.$suffix");
header("Cache-Control:max-age=0");//缓存控制
$writer = IOFactory::createWriter($preadsheet,$type);
$writer->save("php://output");//数据流
1、该方法上述有注释,我在介绍一下
第一个参数是一个数组,键值对,是excel导出的数据字段标题
v数组定义如下参考
$arr = ["A1"=>"创建时间","B1"=>"姓名","C1"=>"手机号","D1"=>"来源","E1"=>"身份",
"F1"=>"付费状态","G1"=>"幼儿园","H1"=>"用户","I1"=>"地区","J1"=>"渠道","K1"=>"销售","L1"=>"运营"
第二个参数是二维数组,也就是excel的主体内容;也是一个二维数组,是你从数据库中获取到的,也可以是自定义的数据源,但一定要是一个二维数组,如果你传一维数组,就只是一行数据。
第三个参数,是你要下载的表名,起个名字传过去;
第四个参数,是下载的格式,默认可以不写xls还是xlsx等等
我下面写了一个demon调用上述那个方法示例
public function _userdownloadexcel($data)
//数据内容(二维数组或一维数组)
$data = $rsp["data"];
//excel数据字段名
$arr = ["A1"=>"创建时间","B1"=>"姓名","C1"=>"手机号","D1"=>"来源","E1"=>"身份",
"F1"=>"付费状态","G1"=>"幼儿园","H1"=>"用户","I1"=>"地区","J1"=>"渠道","K1"=>"销售","L1"=>"运营"
$this->downloadExcel($arr,$data,"全部用户","xls");
第四步:你用浏览器访问这个方法,浏览器就会自动下载啦,恭喜你已经完成下载功能;
一、扩展插件类的自定义使用
上述说了我们引入了两个文件,一个文件是下载,一个文件是用于操作excel使用,其实文件下载那个类就不提了,我们主要下面讲讲如何通过那个类操作excel,上面还讲述了这个类可以操作哪些excel,我在这里附上操作的具体文档,你可以不用我的方法,学会了这个,可以自己自行封装,然后下载。
----------------------------------------赵锐庆-----------------------------------------------、基础
安装:composer require phpoffice/phpspreadsheet
插件支持: 保持在7.1以上 (5.6)
php_zip 支持并启用
php_xml 支持并启用
php_gd2 支持并启用
1.引入文件 use phpOfffice\phpSpreadsheet\Spreadsheet;
2、实例化对象 $spreadsheet = new Spreadsheet();
//获取活动的工作薄
$sheet = $spreadsheet->getActiveSheet();【其实也就是tab键】
//获取单元格
//获取单元格有2种方式字母和数字组合 比如A1 ; 或者采取数组1行1列 等方式,提供如下解决方案
$cellA = $sheet->getCell("A1");//获取单元格
$cellB = $sheet->getCellByColumnAndRow(1,1);//获取单元格
//给单元格设置值
$cellA = $cellA->setValue("赵锐庆");
以上主要就是获取工作薄,获取单元格,设置单元格的值等等方式,接下来我们看一下链式操作方式
$sheet = $spreadsheet->getActiveSheet()->getCell("A1")->setValue("赵锐庆作品");
表示获取活动的工作薄,获取指定的单元格,设置指定的值。
$cellA->getCell("A1")->setValue(); 表示获取A1中的值;
3、保存为xlsx文件
引入保存文件 phpOffice\phpSpreadsheet\writer\xlsx;
$writer = new Xlsx($spreadsheet); //new一个新的类,实例化的时候接收一个活动工作薄
$write->save("php.xlsx"); //保存文件的意思
当你把代码写好,在点击的时候就会触发生成下载。
二、强化单元格
1、快速设置
//获取活动薄
$preadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActivSheet();
//设置单元格的值
$sheet->setcellValue("A1","id");
$sheet->setcellValue("B1","姓名");
$sheet->setcellValue("C1","年龄");
$sheet->setcellValue("D1","身高");
$sheet->setCellValueByColumnAndRow(1,1,"1");
$sheet->setCellCalueByColumnAndRow(2,2,"赵锐庆");
$sheet->setCellValueByColumnAndRow(3,2,"18岁");
$sheet->setCellValueByColumnAndRow(4,2,“188CM”)
2、设置单元格样式
语法:
getStyle 获取单元格样式
getFont 获取单元格文字样式
setBold 设置文字粗细
setName 设置文本字体
setSize 设置文字大小
举个例子:
$sheet->getStyle("B2")->getFont()->setBold(true)->setName("宋体")->setSize(30);
//首先获取了B2单元格的样式,紧接着在湖区单元格文字样式,对其设置了粗体,设置了文本字体,以及大小的问题。
3、设置单元格文字的颜色
getColor()获取坐标颜色
setRGB() 设置字体颜色
getRGB()获取字体颜色
getARGB()设置字体颜色
getARGB()获取字体颜色
举个例子:
设置B2的字体颜色
$sheet->getStyle("B3")->getFont()->getColor()->setRGB("#999999");
echo $sheet->getStyle("B3")->getFont()->getColor()->getRGB("#999999");//表示获取颜色的值
ARGB的用法和这个是相同的;
4、设置单元格的格式
单元格格式
getNumberFormat 获取格式
setformatCode 设置格式
设置一下单元格
$sheet->getStyle("A2")->getNumberFormat()->setFormatCode("yyyy-mm-dd")
表示给A2单元格格式设置成日期,这里yyyy-mm-dd是该创建包中有的(说明在使用这些功能,必须要引入这些功能模块)
设置单元格的换行
$sheet->setCellValue("A1","赵锐庆\n晶晶")
$sheet->getStyle("A1")->getAlignment()->setWrapText(true);
注释:getAlignment() 表示在换行之后进行左对齐
设置超链接
$sheet ->setCellValue("A1","锐庆");
$sheet->getCell("A1")->getHyperlink()->setUrl
("http://www.baidu.com")
设置单元格的统计函数
$sheet->setCellValue("A2","总数:");
$sheet->setCellValue("B2","=SUM(A1:G1)");
三、批量填充
$sheet->fromArray(
[1,"赵锐庆","18岁","180cm"],
[2,"梁玲","19岁","178cm"],
[3,"孙悟空","60岁","178cm"],
],100,A2
这个是批量填充数据,对其值进行如下的解释;
第一个是额二维数组,每一个维度数据,就是Excel表的一行,如果第一个值不是一维数组,就是填充一行数据
第二个值100(如果为null表示没有),表示遇到该值排除不要,
第三个值是A2表示填充,从A2开始进行填充,当然在一开始我们会设置表头的。
(这个语句非常好,省的自己去循环遍历生成了。verygoods)
四、设置单元格样式
1、合并单元格
$sheet->mergeCells("A1:G10"); 表示从A1单元格合并到G10单元格;
$sheet->mergeCells("A1:G10")->setValue("赵锐庆");
注意:如果单独设置值的话
$sheet->getCell("A10")->setValue("必须从第一个单元格就开始设置");
拆分单元格
$sheet->unmergeCells("A1:G10");
2、列与行的操作
列
getColummDimension 获取一列
getWith 获取一列的宽度
setWith 设置一列的宽度
setAUtoSIZE 设置一列的宽度自动调整
getDefaultColumnDimension获取一列的默认值
操作
获取一列的宽度 $sheet->getColumnDimension("A")->getWith();
设置一列的宽度 $sheet->getColumnDimension("B")->setWidth(100);如此一来宽度就被设置100了
设置列列的自适应 $sheet->getColumDimension("c")->setAutoSize(true); //表示设置自适应的列宽
设置默认的列宽 $sheet->getDefaultColumnDimension()->setWidth(100);//表示excel当前每一行的列都已经设置成为了100;
行
获取默认的行高
echo $sheet->getRowDimension(2)->getRowHeight(); 这样就可以获取到默认的行高
$sheet->getRowDimension(2)->setRowHeight(50); 给第二行设置高度为50
$sheet->getDefaultRowDimension()->setRowHeight(1); 设置单元格的高度默认为1
四、下载
xlsx
//设置MIME协议,文件类型,不设置,会默认为html
header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//Mime协议的扩展
header("Content-Disposition:attachment;filename=全部用户.xlsx);
//缓存控制
header("Cache-Control:max-age=0");
$write = \PhpOffice\PhpSpreadsheet\IOFactory::createWrite($spreadsheet,"Xlsx");
//设置写入数据流,允许你已print和echo一样的方式写入到输出缓冲区
$writer->Save("php://output");
通过这种方式浏览器只要一刷新 就能够进行下载。
xls下载
设置tab名称
$sheet->setTitle("这个表名叫做星际穿越");
下载功能(如上一致,就是请求头简单的变了一下,后缀变了一下)
header("Content-Type:application/vnd.ms-excel");