安装 composer require maatwebsite/excel 注意3.0与2.0几乎完全不同的,文档也不同
3.1文档: https://laravel-excel.maatwebsite.nl/3.1/getting-started/
1.导出
推荐导出文档: https://blog.csdn.net/beyond__devil/article/details/83008782
https://blog.csdn.net/u010324331/article/details/83658747
use App\Extensions\myapp\Models\Goods; //商品model
use Maatwebsite\Excel\Concerns\FromCollection; //excel表单字段集 必备
use Maatwebsite\Excel\Concerns\WithHeadings; //excel标题行
class GoodsExport implements FromCollection, WithHeadings {
public function __construct($post) {// 如果需要的话可以通过构造函数传递参数
$this->post = [];
if(is_array($post) && count($post)>0) {
$this->post = $post;
public function collection() {
// return Goods::select('goods_name','price','stock')->get();// 查询数据直接返回
public function headings(): array { //表格列头标题 WithHeadings
return array( '商品名', '售价', '库存');
调用 实例化的时候可以通过构造函数传递参数, 用于数据库查询
use Excel;
use App\Extensions\myapp\Controllers\Admin\Excel\GoodsExport;
public function exportGoods(Request $request) {
return Excel::download(new GoodsExport($request->all()), '商品导出表.xlsx');//直接下载
}
1.5 导出队列任务 针对需要导出大量数据的情况
使用方法分两种,隐式、显示。
1.直接创建队列任务 Excel::queue(new OrdersExport($request->all()), $ExportTask->filename, 'public'); 将存储到服务器 publc存储目录下。
2.隐式,OrdersExport()导出类中继承 use Illuminate\Contracts\Queue\ShouldQueue; 即可,正常使用Excel::store()存储到指定位置。
官文: https://docs.laravel-excel.com/3.1/exports/queued.html
可使用chain方法 增加最后执行任务,将在导出队列任务完全成功执行完成后调用。 Excel::queue()->chain([ new OrdersExportQueue($ExportTask->toArray()) ]);
2.导入
// 注意导入文件数据量可能过大,因此最好通过队列执行,每次导入一部分,通过标记跳过已导入的部分。。。导入同样可用queue加入队列任务,这里我自己写的方法,递归创建导入队列
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Collection;
use App\Extensions\myapp\Jobs\ProductImportQueue; // 队列
use App\Extensions\myapp\Models\Product;
class ProductImport implements ToCollection {
public $path;
public function __construct($path) {
$this->path = $path;
public function collection(Collection $rows) {
// 缓存读取已导入数量
// 循环导入100条
// 若未导入完成,记录缓存,并重新创建队列 (或者重新执行队列?)
// dispatch(new ProductImportQueue($this->path));
use Illuminate\Support\Facades\Storage;
use App\Extensions\myapp\Controllers\Admin\Excel\ProductImport;
use Excel;
public function importProduct(Request $request) {
$file = $request->file('goods_excel'); // 通过laravel的request获取文件
if ($file && $file->isValid()) {
// 获取文件相关信息
$originalName = $file->getClientOriginalName(); // 文件原名
$ext = $file->getClientOriginalExtension(); // 扩展名
// $realPath = $file->getRealPath(); //临时文件的绝对路径
// $type = $file->getClientMimeType(); // image/jpeg
if($ext!='xlsx' && $ext!='xls'){
return $this->responseAjax('fail','请上传excel文件');
$filename = $originalName;
if(Storage::disk('public')->exists('uploads/'.$filename)) {
return $this->responseAjax('fail','文件已上传');
// 上传文件 存于服务器
Storage::disk('public')->makeDirectory('uploads');
Storage::disk('public')->putFileAs('uploads',$file,$filename);
//执行同步
$path = 'public/uploads/'.$filename;
Excel::import(new ProductImport($path), $path);
// use App\Extensions\myapp\Jobs\ProductImportQueue;
// dispatch(new ProductImportQueue($path)); 加入队列