生産過程會出現很多使用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”,找到了類似我的遇到的問題,原來鬼佬也都是很多菜雞的嘛。
詳細看了一下回答者的答案,雖然不是百分之百的對應我的問題,但是我看到了關鍵的一點
嗯?這有點像樣,然後我在看看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再添加内容。