Laravel如何导出Excel_Laravel数据导出功能实现方法【操作】

夜墨酱_1244

夜墨酱_1244

2026-04-21

171人浏览

原创

maatwebsite/excel 4.x 必须用 Export 类实现 FromCollection 或 FromQuery 接口,废弃 Excel::create();Facade 需手动注册,推荐依赖注入;FromQuery 更省内存,中文乱码需设中文字体,大文件导出应流式处理并调优服务器配置。

laravel如何导出excel_laravel数据导出功能实现方法【操作】

用 maatwebsite/excel 导出 Excel 最快路径

直接装包、注册服务、写控制器方法,三步能跑起来。但别急着复制粘贴,maatwebsite/excel 从 3.x 升到 4.x 后,Excel::create() 和 Excel::export() 完全废弃,现在必须用 Export 类 + FromCollection 或 FromQuery 接口。

常见错误是照着老教程写 Excel::download(new UsersExport, 'users.xlsx') 却报 Class "Excel" not found——那是 Laravel 10+ + maatwebsite/excel 4.x 的典型症状,因为 Facade 默认没注册,得手动加到 config/app.php 的 'aliases' 里:

use Maatwebsite\Excel\Facades\Excel;
'Excel' => Excel::class,

不过更推荐跳过 Facade,直接用依赖注入或门面调用方式,避免配置遗漏。

FromCollection vs FromQuery 怎么选

导出量小(FromCollection;导出量大(>10k 行)、不想把全部数据 load 进内存、数据库字段基本直出,优先用 FromQuery。

容易踩的坑:

  • FromCollection 的 collection() 方法返回的是 Collection 实例,不是数组——别直接 return $users->toArray(),得 return new Collection($users)
  • FromQuery 要求实现 query() 方法,返回 Builder 对象,不能提前 ->get(),否则失去流式导出意义
  • 用 FromQuery 时,map() 回调里不能访问 Eloquent 关系(如 $user->profile),因为没 eager load;要关联字段,得在 query 里 select() 或 join()

导出中文表头和单元格乱码怎么办

不是编码问题,是 PHPExcel / PhpSpreadsheet 默认不设 UTF-8 字体,中文会 fallback 到不支持中文的字体(比如 Calibri),显示成方块或空白。

Image To Excel
Image To Excel

从图像中提取表格内容,获取行列数据,纠正识别错误,生成格式良好的Excel文件。

下载

解决方式统一:在 Export 类里加 registerEvents() 方法,强制设字体:

public function registerEvents(): array
{
    return [
        AfterSheet::class => function(AfterSheet $event) {
            $event->sheet->getStyle('A1:Z1000')->getFont()->setName('Microsoft YaHei');
        },
    ];
}

注意点:

  • 字体名必须是系统实际存在的,Linux 服务器常缺中文字体,得先装 fonts-wqy-zenhei 或上传 ttf 文件并用 PhpSpreadsheet\Shared\Font::setCacheStorage() 注册
  • 别在 map() 里动态改样式——性能爆炸,样式应在 registerEvents 或 columnFormats() 中批量设
  • 如果只导数字和 ASCII,乱码大概率是 BOM 头导致,检查导出响应头是否含 utf8_encode() 之类多余转换

大文件导出卡死或超时

Laravel 默认执行时间 30 秒,导出 5w 行 Excel 基本必超时。别急着调 set_time_limit(0),那只是掩盖内存和 IO 问题。

真正有效的做法:

  • 用 FromQuery 替代 FromCollection,配合 chunkById() 让 PhpSpreadsheet 流式读库,内存占用从几百 MB 降到几 MB
  • Nginx 需加 fastcgi_read_timeout 600;,否则 60 秒就断连,前端看到空响应
  • Apache 下确保 mod_php 没开 zlib.output_compression,它会干扰 Excel 二进制流,导致文件打不开
  • 别在本地开发环境测大数据量——Homestead/Valet 的 PHP 内存限制太低,php.ini 里 memory_limit 至少设为 512M

导出逻辑一旦涉及复杂计算、多次 DB 查询或第三方 API 调用,就得拆成队列任务;Excel 生成本身不适合塞进队列,但数据准备可以——这是最容易被忽略的分层点。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

857

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

855

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2508

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

4421

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

6430

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

4236

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

7949

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1496

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

215

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 44.7万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习