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给指定单元格加超链接:
- 首先让你的Export类实现
WithEvents接口 - 在
map方法中同时返回显示文本和跳转链接,后续处理完成后可隐藏链接列 - 在
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
相关产品推荐
相关产品推荐

