生产过程会出现很多使用excel表的导入导出,而官方文档3.X版本开始基本就重构了整个项目,不过对于我来说没啥问题,反正之前的版本我也没用过(笑脸)。
现在项目我只做到导入阶段,根据官方文档的 5分钟极速入门文档(对的,只有这么少,我把整个import文档都看完了,我一直深度怀疑我是不是没有找到完整版的文档,直到我看到官网右上角闪耀着的 Vedio Course 还TM打折了都要69美元,对于我这种买个打3折再加优惠券只售5美元的游戏也要向老婆申请资金援助的农民来说简直要了我的命,我就是要白嫖)。言归正传,首先导入功能有ToModel,ToArrary,ToCollection三个主要模式(我认为)
一.Tomodel
贴上官网的教程代码
namespace App\Imports;
use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
class UsersImport implements ToModel
{
public function model(array $row)
{
return new User([
'name' => $row[0],
]);
}
}
官网地址:https://docs.laravel-excel.com/3.1/imports/model.html
这个比较好理解 上面的return new User 就是把从excel读取的数组传到model里面,然后model就会自动导出到数据库了,关于model的详细信息请参阅Laravel官方文档。
二.ToCollection && ToArrary
同样贴上官网代码
Create a new class called UsersImport in app/Imports:
namespace App\Imports;
use App\User;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
class UsersImport implements ToCollection
{
public function collection(Collection $rows)
{
foreach ($rows as $row)
{
User::create([
'name' => $row[0],
]);
}
}
}
官网地址:https://docs.laravel-excel.com/3.1/imports/collection.html
看到这些代码对于我这种老年菜鸡来说简直就是有毒啊,按照正常逻辑来说导入到model才需要使用到User吧,我单纯的就是想把excel的数据导入到数组为什么还需要调用到User呢。还好官网有演示在Controller里面的操作,下面贴上代码
In your controller we can now import this:
public function import()
{
Excel::import(new UsersImport, 'users.xlsx');
}
哇!精彩,这就行了?什么东西,连collection方法都没有调用啊(难道会自动调用该方法?菜鸡不知道也不敢问),我怎么取出数组?
还有一个更精彩的东西在这个Controller演示下面还有一个黄色底的提示语句:
Whatever you return in the collection() method will not be returned to the controller.
既然这个方法怎么搞都不会返回那用来做什么呢?这只有两段代码的文档真的太牛皮了,新手好感度爆满!
基于白嫖才是真理的,有直路不走我偏要走弯路,我赶紧百度各种关键词 “laravel excel 3.1 导入 数组”,搜索出的laravel中文网上有一个视频教程,嗯,也是要钱的,告辞。
基于不能白嫖自己人的心态,我在google上面输入了 “laravel excel 3.1 import to array”,找到了类似我的遇到的问题,原来鬼佬也都是很多菜鸡的嘛。
详细看了一下回答者的答案,虽然不是百分之百的对应我的问题,但是我看到了关键的一点
$rows = Excel::toArray(new SalesOrderImport, $request->file('sampledata'));
嗯?这有点像样,然后我在看看SalesOrderImport这个类写的是啥,找了一下这个回答者并没有放出来,只写了一句
In my SalesOrderExport class I have default function only, which is required as abstract method.
我当即骂了一句现在说的是import你不写import类你扯什么Export呢。
但是一句Default提醒了我,如何我直接使用默认artisan创建的ToCollection类会怎么样呢,
我的import
<?php
namespace App\Imports;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
class TestImport implements ToCollection
{
/**
* @param Collection $collection
*/
public function collection(Collection $rows)
{
}
}
我的controller
public function test1(){
$array = Excel::toCollection(new TestImport,'test.xlsx');
dd($array);
}
结果
Illuminate\Support\Collection {#453 ▼
#items: array:1 [▼
0 => Illuminate\Support\Collection {#438 ▼
#items: array:2 [▼
0 => Illuminate\Support\Collection {#437 ▼
#items: array:3 [▼
0 => 1
1 => 2
2 => 3
]
}
1 => Illuminate\Support\Collection {#440 ▼
#items: array:3 [▼
0 => 4
1 => 4
2 => 4
]
}
]
}
]
}
DNLM,原来这就行了,这么简单的东西官网的教程都是写什么东西,弄到这里我已经确定了 Collection方法一定是会自动调用了,因为我尝试过把Collection方法删除,运行提示错误所以这个collection应该是一个用来处理excel数据的地方。这个以后再慢慢玩一下。以后再使用到比较复杂得Import再添加内容。