首发于程序人生

使用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");
header("Content-Disposition:attachment;filename=下载.XLS");
//缓存控制
header("Cache-Control:max-age=0");
$writer = \phpOffice\phpSpreadsheet\IOFactory::createWrite($spreadsheet,"Xls");
$write->save("php://output");


本文作者:赵锐庆,尊重版权,抒写不易。

发布于 2020-01-18 01:07