使用PhpOffice\PhpSpreadsheet生成Excel表格

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用ChatGPT生成的代码,生成的表格一直是乱码状态。
然后百度了几个方法都是一样的乱码,还有生成的文件错误,不能打开的问题。
应该是请求头header的问题。
最后去查了Spreadsheet官方文档,改了header才跑通的。

一、PhpOffice\PhpSpreadsheet是什么?

生成表格的库,我是看了PHPExcel那个库官方不更新了,加上这个库看起来功能强大,所以试一下好不好用。

二、使用步骤

1.使用 composer 来安装 PhpSpreadsheet:

*composer require phpoffice/phpspreadsheet*

2.安装好直接用

1)、创建一个新的 Spreadsheet 对象

代码如下(示例):

       /** 创建一个新的 Spreadsheet 对象 **/
        $spreadsheet = new Spreadsheet();

2)、修改表格样式

我这边是修改了列宽,还可以改很多格式,下面文档可以查看
详细格式修改文档

---        // 默认列宽
        $spreadsheet->getActiveSheet()
            ->getDefaultColumnDimension()
            ->setWidth(15);

3)、写入表头

*setCellValueByColumnAndRow()*方法第一个代表列数,第二个代表行数。第一列就是A,以此类推。下面方法第一个写入的就是A1。

$columnIndex = 1;
foreach ($header as $item) {
    $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($columnIndex, 1, $item);
    $columnIndex++;
}

4)、循环写入数据

我这个方法传入的 d a t a 的数据和 data的数据和 data的数据和header都是关联数组,他们的key值是对应的,所以可以这样循环写入。我下面会给例子。

$header = [
    'name' => '姓名',
    'age' => '年龄'
];
$data = [
    [
        'name' => '小明',
        'age' => 16,
    ],
    [
        'name' => '小黑',
        'age' => 17,
    ],
];
$rowIndex = 2;
foreach ($data as $value) {
    $columnIndex = 1;
    foreach ($header as $key => $val) {
        $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($columnIndex, $rowIndex, $value[$key]);
        $columnIndex++;
    }
    $rowIndex++;
}

5)、创建 Excel writer

这里官方文档还有另一种createwriter的方法,我没用,我用的这个。

// 创建 Excel writer
$writer = new Xlsx($spreadsheet);

6)、设置文件名和 Content-Disposition 头部

// 设置文件名和 Content-Disposition 头部
$fileName = $fileName . date('Y-m-d', time()) . ".xlsx";
header('Content-Disposition: attachment; filename=' . $fileName);

我之前代码一直不能用就是这里的header不对,我记录下我两种不能用的前缀。
第一种:.xls结尾的文件,对应的是“vnd.ms-execl”,不能跑。

header('Content-Type: application/vnd.ms-execl');
header('Content-Disposition: attachment;filename=xx报表.xls');
header('Cache-Control: max-age=0');
$writer->save('php://output');

第二种:.xlsx结尾的文件,对应的是“vnd.openxmlformats-officedocument.spreadsheetml.sheet”,反正我都跑不了。

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $fileName . '"');
header('Cache-Control: max-age=0');
$writer->save('php://output');

7)、将 Excel 文件写入到输出缓冲区

// 将 Excel 文件写入到输出缓冲区
$writer->save('php://output');

8)、将 Excel 文件写入到输出缓冲区

这两步我就看个热闹,他说作用是那就是了,反正能跑。

   // 立即刷新输出缓冲区, 以确保Excel文件可以正确地下载。
    flush();
    exit;

总结

跑不了的方法就去找官方文档,跟着官方文档写就能跑了。
这是完整的方法代码:


```powershell
public function exportExcel(array $header, array $data, string $fileName = "")
{
    /** 创建一个新的 Spreadsheet 对象 **/
    $spreadsheet = new Spreadsheet();

    // 默认列宽
    $spreadsheet->getActiveSheet()
        ->getDefaultColumnDimension()
        ->setWidth(15);

    $columnIndex = 1;
    foreach ($header as $item) {
        $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($columnIndex, 1, $item);
        $columnIndex++;
    }

    $rowIndex = 2;
    foreach ($data as $value) {
        $columnIndex = 1;
        foreach ($header as $key => $val) {
            $spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($columnIndex, $rowIndex, $value[$key]);
            $columnIndex++;
        }
        $rowIndex++;
    }
    // 创建 Excel writer
    $writer = new Xlsx($spreadsheet);

    // 设置文件名和 Content-Disposition 头部
    $fileName = $fileName . date('Y-m-d', time()) . ".xlsx";
    header('Content-Disposition: attachment; filename=' . $fileName);

    // 将 Excel 文件写入到输出缓冲区
    $writer->save('php://output');

    // 立即刷新输出缓冲区, 以确保Excel文件可以正确地下载。
    flush();
    exit;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding-雷欧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值