2015-07-13 69 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'只会占用第一张纸,对吧? –