天天看點

關于Laravel Excel 3.1 Import使用中的相關問題

生産過程會出現很多使用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再添加内容。