[扩展推荐] 如何在 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
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《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年前 评论

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