[扩展推荐] 如何在 Laravel 项目中处理 Excel 文件

说明

maatwebsite/excel 是一款强大的 Excel 文件处理扩展包, 能够快速完成 Excel 文件的的导出, 解析等功能.

文章的 DEMO 项目

截图

运行

Demo 代码请见:

https://github.com/zhengjinghua/est-excel-...

请参照此文档运行 Demo:

分享:如何利用 Homestead 快速运行一个 Laravel 项目

文章概览

  1. 安装;
  2. 基础用法;
  3. 更多功能.

接下来是详细解说.

安装

1). 使用 Composer 安装该扩展包:

composer require maatwebsite/excel

2). 安装完成后,修改 config/app.phpproviders 数组内追加如下内容

'providers' => [
    ...
    Maatwebsite\Excel\ExcelServiceProvider::class,
],

3). 同时在 aliases 数组内追加如下内容:

'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]

4). 接下来运行以下命令生成此扩展包的配置文件 config/excel.php

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

默认配置基本能通用大部分的项目开发需求, 因此本文不对此配置文件做过多叙述, 想深入研究的童鞋可以阅读官方文档.

到此, 此拓展包即安装成功 :beers::beers::beers:

基础用法

解析 Excel 文件

// $excel_file_path = 你的 Excel 文件存放地址
$excel_data = Excel::load($excel_file_path, function($reader) {
    $excel_data = Excel::load($excel_file_path)->get()->toArray();

    // 直接打印内容即可看到效果
    echo 'job.xlsx 表格内容为:';
    dd($excel_data);
});

将数据导成 Excel 文件

// 导出 Excel 并能直接在浏览器下载
# $export_file_name = 要生成的文件名
Excel::create($export_file_name, function ($excel) {
    $excel->sheet('Sheetname', function ($sheet) {
        $sheet->appendRow(['data 1', 'data 2']);
        $sheet->appendRow(['data 3', 'data 4']);
        $sheet->appendRow(['data 5', 'data 6']);
    });
})->download('xls');

// 导出 Excel 并存储到指定目录
Excel::create($export_file_name, function ($excel) {
    $excel->sheet('Sheetname', function ($sheet) {
        $sheet->appendRow(['data 1', 'data 2']);
        $sheet->appendRow(['data 3', 'data 4']);
        $sheet->appendRow(['data 5', 'data 6']);
    });
})->store('xls', $object_path);

导出的 Excel 内容见下图:

36d628e26b59530839f3e1c4230c918f.png

更多功能

除了上述的解析/导出功能外, 此扩展包还支持:

  1. 解析指定表格里的指定列;
  2. 格式化日期;
  3. 添加计算公式;
  4. 缓存表格;
  5. 批量解析指定目录里的所有 Excel 文件;
  6. 可以做格式转换, 如将 csv 转换成 xls, 反之亦可;
  7. 可以将 Excel 结合 blade 模板引擎进行渲染.

这些更多的用例请移步 官方文档 参考.

本项目由 The EST Group 成员 @monkey 整理发布,首发地为 PHPHub 社区,转载必须贴上原文链接。


欢迎关注 LaravelTips, 一个专注于为 Laravel 开发者服务, 致力于帮助开发者更好的掌握 Laravel 框架, 提升开发效率的微信公众号.

本帖已被设为精华帖!
monkey
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 17

今天刚好有个开发任务需要导入 excel,就使用了一下这个扩展包,还挺方便的 :+1:

7年前 评论

@xiaoxiaoyu 你好,我要导入csv文件,但是中文获取不到,英文就可以,github上有类似的问题(链接),通过修改参数to_ascii就可以导入中文,我修改后还是不能解决问题,我的版本是maatwebsite:2.1.0,laravel:5.2

7年前 评论

@stoneLon 你好,请问你的导入excel,第一行为中文时,导致无法解析的问题的解决了吗?我现在也面临这个问题,如果你有答案,麻烦帮助我下,谢谢!

7年前 评论

@monkey 数据为0的时候,excel导出为空,怎么处理啊

7年前 评论

@hiword 试一试excel.php配置文件中的to_ascii改成false

7年前 评论

请问如何设置自动列宽,数据太多的话直接挤在一起了

6年前 评论

如果大型的excel怎样处理,50M的excel就需要500M运存才能执行,经常500

6年前 评论

@wuhaohui 我也在想这个问题,目前想法是分块导出,写入同一个文件

6年前 评论

@wuhaohui 我解决了这个问题,现在导出10W条数据的Excel 内存占用不到10MB,耗时大概3-4S。
解决的大体思路就是:取数据和写数据的时候 要一条一条来,不要一次性都写到内存中。
取数据我是采用laravel的游标(cursor)来从数据库读取数据,每次只读取一条数据,每读取一条记录就fputcsv直接输出给浏览器,输出CSV格式。

6年前 评论

@CoderPoet 你这个问题能写个demo吗?感激不尽!!

6年前 评论

@海风蓝 转为字符串 0 就可以了

6年前 评论

lumen中如何配置使用laravel-excel呢?

6年前 评论

我安装了提示Call to undefined method Maatwebsite\Excel\Excel::create(),求解丫

5年前 评论

我按照上面的步骤配置完了发生了
FatalErrorException
Class 'App\Http\Controllers\Data\Excel' not found
这个错误,项知道是什么原因造成的

5年前 评论

@luning3574 @kevin2011
Excel::load() is removed and will not be re-added until 3.1
降低版本到 2.0

5年前 评论
dapaoteshi 3年前

解析的时候,报错,请问是什么原因?谢谢! Unable to resolve NULL driver for [Maatwebsite\Excel\Transactions\TransactionManager]

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!