You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maatwebsite/Laravel-Excel 3.1导出带超链接Excel且无需Blade的实现方法

Maatwebsite/Laravel-Excel v3.1 无Blade导出超链接实现方案

方法一:直接返回Hyperlink对象(最简方案)

3.1版本已内置超链接对象支持,无需额外监听事件,直接在map方法中返回Maatwebsite\Excel\Hyperlink实例即可:

use Maatwebsite\Excel\Hyperlink;

public function map($user): array
{
    return [
        $user->name,
        // 第一个参数为跳转链接,第二个参数为单元格显示文本
        new Hyperlink($user->ref_link, $user->ref_title)
    ];
}

方法二:通过AfterSheet事件实现(兼容所有3.x版本)

如果需要更复杂的定制逻辑,可以通过监听导出完成事件,调用PhpSpreadsheet原生API给指定单元格加超链接:

  1. 首先让你的Export类实现WithEvents接口
  2. 在map方法中同时返回显示文本和跳转链接,后续处理完成后可隐藏链接列
  3. 在registerEvents方法中遍历行给对应单元格绑定超链接

完整代码示例:

<?php

namespace App\Exports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;

class UsersExport implements FromCollection, WithHeadings, WithMapping, WithEvents
{
    public function collection()
    {
        return User::all();
    }

    public function headings(): array
    {
        return [
            '姓名',
            '参考链接'
        ];
    }

    public function map($user): array
    {
        return [
            $user->name,
            $user->ref_title,
            // 第三列存跳转链接,后续会隐藏
            $user->ref_link,
        ];
    }

    public function registerEvents(): array
    {
        return [
            AfterSheet::class => function(AfterSheet $event) {
                $highestRow = $event->sheet->getDelegate()->getHighestRow();
                // 跳过表头从第2行开始遍历
                for ($row = 2; $row <= $highestRow; $row++) {
                    $linkUrl = $event->sheet->getCell('C'.$row)->getValue();
                    if (!empty($linkUrl)) {
                        // 给B列的标题单元格绑定超链接
                        $event->sheet->getCell('B'.$row)->getHyperlink()->setUrl($linkUrl);
                    }
                }
                // 隐藏存储链接的C列
                $event->sheet->getColumnDimension('C')->setVisible(false);
            },
        ];
    }
}

注意事项

  • 跳转链接需要补全完整的http:///https://前缀,否则Excel会识别为本地文件路径无法正常跳转
  • 方法一需要你的Maatwebsite/Laravel-Excel版本≥3.1.0,无额外依赖配置,优先推荐使用

内容的提问来源于stack exchange,提问作者Muhaimenul Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:06:04