做个有深度的程序员 — YuanGe
PHP使用PhpSpreadsheet 自动生成excel文件并下载
PHP使用PhpSpreadsheet 自动生成excel文件并下载

PHP使用PhpSpreadsheet 自动生成excel文件并下载

遇到一个需要导出导入excel文件的需求,这两天一直在搞这个,昨天没更并不是因为偷懒哈😁

hpSpreadsheet下载

上一篇文章已经解释很清楚了:http://119.23.67.123/2021/06/05/composer-phpspreadsheet/

PhpSpreadsheet是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式 PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到

  • 把下载好 的插件放进工程根目录
  • 在php文件中导入
<?php
require 'vendor/autoload.php';

//使用Spreadsheet类
use PhpOffice\PhpSpreadsheet\Spreadsheet;
//xlsx格式类
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
//可以生成多种格式类
//use PhpOffice\PhpSpreadsheet\IOFactory;
  • 实例化Spreadsheet对象
 // 实例化 Spreadsheet 对象
 $spreadsheet = new Spreadsheet();
 
 // 获取工作薄
 $worksheet= $spreadsheet->getActiveSheet();
  • excel表头设置
//表头数组
$title = ['订单号', '样品/礼品', '收件人','手机号','地址','快递单号'];
/**
 * 参数说明
 * setCellValueByColumnAndRow(参数1,参数2,参数3)
 * 参数1:列位置
 * 参数2:行位置
 * 参数3:单元格的值
 */
//表头
//设置单元格内容 遍历表头的数组设置到单元格上
foreach ($title as $key => $value) {
    $worksheet->setCellValueByColumnAndRow($key+1, 1, $value);
}
  • 设置工作表的名称
//设置工作表标题名称
$worksheet->setTitle('工作表格1');

效果:

  • 从数据库中获取数据,并按照自己想要的数据排序好
//表单数据
$dataResult = array();      //todo:导出数据(自行设置)
$sql = "SELECT * FROM exchange_record WHERE status=0 and address is not null LIMIT 1000";//
$result = $conn->query($sql);

//>0就是有数据
if ($result->num_rows > 0) {
    // 输出数据
    while($row = $result->fetch_assoc()) {

        global $sql;
        //创建一个数组 记录每条数据,按我们要的顺序添加进去。
        $d = array();
        $d["order_id"] = $row["order_id"];
        //查 样品/礼品 名字
        s 
        //根据id查名字
        $result2 = $conn->query($sql);
        // 输出数据
        while($row2 = $result2->fetch_assoc()) {
            $d["name"] = $row2["name"];
        }
        $d["consignee"] = $row["consignee"];
        $d["phone"] = $row["phone"];
        $d["address"] = $row["address"];
        $d["express_id"] = null;
        //把数组添加到多维数组中
        $dataResult[] = $d;
    }
}

$dataResult可以是任何你想要渲染到单元格的多维数组

  • 把数据填充到对应的单元格
$row = 2; //从第二行开始
//便利数据数组填充到对应的单元格
foreach ($dataResult as $item) {
    $column = 1; //列从第一格开始
    foreach ($item as $value) {
        $worksheet->setCellValueByColumnAndRow($column, $row, $value);
        $column++;
    }
    $row++;  //每一列填充完,+1
}
  • 生成excel文件,并设置对应的响应头

//文件名
$fileName = '订单数据';
//文件类型
$fileType = 'Xlsx';

//1.下载到服务器
//$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
//$writer->save($fileName.'.'.$fileType);

//2.输出到浏览器
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); //按照指定格式生成Excel文件
excelBrowserExport($fileName, $fileType);
$writer->save('php://output');

上面的excelBrowserExport();是我封装好的设置响应头的方法,下载时候显示的文件名,类型都是在响应头设置

/**
 * 输出到浏览器(需要设置header头)
 * @param string $fileName 文件名
 * @param string $fileType 文件类型
 */

function excelBrowserExport($fileName, $fileType) {
    //文件名称校验
    if(!$fileName) {
        trigger_error('文件名不能为空', E_USER_ERROR);
    }

    //Excel文件类型校验
    $type = ['Excel2007', 'Xlsx', 'Excel5', 'xls'];
    if(!in_array($fileType, $type)) {
        trigger_error('未知文件类型', E_USER_ERROR);
    }

    if($fileType == 'Excel2007' || $fileType == 'Xlsx') {
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="'.$fileName.'.xlsx"');
        header('Cache-Control: max-age=0');
    } else { //Excel5
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$fileName.'.xls"');
        header('Cache-Control: max-age=0');
    }
}

后面我会专门写一篇header头设置的博客。

有两种生成方式实现下载对应的excel。一种是在服务器本地生成一个excel文件然后返回path给前端进行下载。一种是直接输出到浏览器。

IOFactory::createWriter();方法是将创建的$spreadsheet对象生成为excel文件

save('php://output'); 官方的文档的注释是:将输出重定向到客户端的 Web 浏览器 。我的理解就是当你动态生成excel文件,想实现通过浏览器直接下载。

当我们完成这些步骤后并通过浏览器访问php文件,浏览器就会制动下载

打开就是这样的

我们可以看到因为单元格列宽不够,文字会显示不全,所有我们要对单元格的属性进行设置

$worksheet->getColumnDimension('A')->setWidth(20);

setWidth()设置成自己想要的参数就可以了

基础Spreadsheet开发使用示例:https://blog.csdn.net/jackbon8/article/details/107915006

官方文档(英文版)需要翻译:https://phpspreadsheet.readthedocs.io/en/stable/topics/recipes/

好了,先写到这了,写这个博客花了我2个小时,也是真的累。如果那里写错了,或有更好的方法,可以在下面评论。

-->