2015-07-13 68 views
12

我有這個項目,我應該可以上傳一個excel文件並閱讀內容,然後將信息上傳到數據庫。所以我決定用圖書館來幫助我,這將變成Maatwebsite/Laravel-Excel閱讀excel文件並上傳到數據庫Laravel 5

但我試過閱讀文檔http://www.maatwebsite.nl/laravel-excel/docs/import,但我似乎無法找到我需要的那個。

例如,在第一行JohnKennedy在我的Excel文件,Male 這在我的數據庫corrensponds First NameLast NameGender。 我如何閱讀並上傳?有人能幫我嗎?

謝謝!

我截至目前

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(); 
    } 
} 

回答

19
給您的Excel工作表的列名

代碼完全一樣的數據庫列名以下是足夠的,按照上述控制器類

加,

use Maatwebsite\Excel\Facades\Excel; 

和功能代碼,

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

假設有多於一個工作簿中一個片材,則必須額外foreach遍歷片如下,

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

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

Read More

如果使用的是Laravel 5.3並給出您的Excel表格列不準確

利用下面的代碼,以適合您的需求

/** 

* 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.'); 

} 

退房完整教程here

注意,默認情況 - 一旦你的數據被extacted從您的Excel工作表,所有的列名被轉換以小寫字母表示,名稱之間的所有空格都用下劃線替換。

+0

嗨。感謝您的幫助,我已經解決了我的問題,然後纔看到您的答案,但是您的User :: firstOrCreate($ row);幫助我有一個更乾淨的代碼。比分配每個值,如$ customer-> title = $ value ['title'];謝謝!我會接受:) – jackhammer013

+0

很高興我能幫到你。 –

+0

@pinkalvansia如果有2張或更多的紙張,該怎麼辦?因爲根據你的代碼,'foreach'只會佔用第一張紙,對吧? –