2015-07-13 21 views
12

Mam ten projekt, w którym powinienem móc przesłać plik Excela i przeczytać jego zawartość, a następnie przesłać informacje do bazy danych. Więc postanowiłem użyć biblioteki, aby mi pomóc, która okazuje się być Maatwebsite/Laravel-ExcelCzytanie pliku excel i przesyłanie do bazy danych Laravel 5

Ale próbowałem czytać dokumentację http://www.maatwebsite.nl/laravel-excel/docs/import, ale nie mogę znaleźć tego, którego potrzebuję.

Na przykład w moim pliku excel w pierwszym rzędzie John, Kennedy, Male co w mojej bazy danych corrensponds First Name, Last Name, Gender. Jak mogę przeczytać i przesłać? Czy ktoś może mi pomóc?

Dzięki!

Mój kod już teraz

public function postUploadCsv() 
{ 
    $rules = array(
     'file' => 'required', 
     'num_records' => 'required', 
    ); 

    $validator = Validator::make(Input::all(), $rules); 
    // process the form 
    if ($validator->fails()) 
    { 
     return Redirect::to('customer-upload')->withErrors($validator); 
    } 
    else 
    { 
     $file = Input::file('file'); 
     dd($file); 
     exit(); 
    } 
} 

Odpowiedz

19

danego swoimi nazwami kolumn arkusza Excel są dokładnie jak nazwy kolumn bazy danych Poniżej wystarczyć

Dodaj następujący powyżej klasie kontrolera,

use Maatwebsite\Excel\Facades\Excel; 

i kod funkcji,

public function postUploadCsv() 
{ 
    $rules = array(
     'file' => 'required', 
     'num_records' => 'required', 
    ); 

    $validator = Validator::make(Input::all(), $rules); 
    // process the form 
    if ($validator->fails()) 
    { 
     return Redirect::to('customer-upload')->withErrors($validator); 
    } 
    else 
    { 
     try { 
      Excel::load(Input::file('file'), function ($reader) { 

       foreach ($reader->toArray() as $row) { 
        User::firstOrCreate($row); 
       } 
      }); 
      \Session::flash('success', 'Users uploaded successfully.'); 
      return redirect(route('users.index')); 
     } catch (\Exception $e) { 
      \Session::flash('error', $e->getMessage()); 
      return redirect(route('users.index')); 
     } 
    } 
} 

UPDATE

Załóżmy, że masz więcej niż jeden arkusz w skoroszycie, będziesz miał dodatkowe foreach do iterację nad arkuszami jak poniżej,

Excel::load(Input::file('file'), function ($reader) { 

    $reader->each(function($sheet) {  
     foreach ($sheet->toArray() as $row) { 
      User::firstOrCreate($row); 
     } 
    }); 
}); 

Read More

w przypadku korzystania Laravel 5.3 i biorąc pod uwagę, że Twoje arkusze arkusza programu Excel nie są dokładne

Wykorzystaj następującego kodu do swoich potrzeb

/** 

* Import file into database Code 

* 

* @var array 

*/ 

public function importExcel(Request $request) 

{ 


    if($request->hasFile('import_file')){ 

     $path = $request->file('import_file')->getRealPath(); 


     $data = Excel::load($path, function($reader) {})->get(); 


     if(!empty($data) && $data->count()){ 


      foreach ($data->toArray() as $key => $value) { 

       if(!empty($value)){ 

        foreach ($value as $v) {   

         $insert[] = ['title' => $v['title'], 'description' => $v['description']]; 

        } 

       } 

      } 




      if(!empty($insert)){ 

       Item::insert($insert); 

       return back()->with('success','Insert Record successfully.'); 

      } 


     } 


    } 


    return back()->with('error','Please Check your file, Something is wrong there.'); 

} 

Sprawdź pełną samouczek here

pamiętać, że domyślnie - Gdy dane są extacted z excel arkusz, wszystkie nazwy kolumn są przekształcane na małe litery, a wszystkie spacje między nazwami są zastępowane podkreśleniem.

+0

Witam. Dzięki za pomoc, już naprawiłem swój problem, zanim zobaczyłem twoją odpowiedź, ale Twój użytkownik :: firstOrCreate ($ row); pomógł mi mieć czystszy kod. niż przypisywanie każdej wartości, takiej jak $ customer-> title = $ value ['title']; Dzięki! Przyjmuję to :) – jackhammer013

+0

Cieszę się, że mogę pomóc. –

+0

@pinkalvansia co jeśli są 2 lub więcej arkuszy? Ponieważ zgodnie z Twoim kodem, foreach zajmie tylko pierwszy arkusz, prawda? –

Powiązane problemy