【问题标题】:Reading excel file and uploading to database Laravel 5读取excel文件并上传到数据库Laravel 5
【发布时间】:2015-10-01 09:18:21
【问题描述】:

我有这个项目,我应该能够上传一个 excel 文件并读取内容,然后将信息上传到数据库。所以我决定使用一个库来帮助我找出它原来是Maatwebsite/Laravel-Excel

但我尝试阅读文档http://www.maatwebsite.nl/laravel-excel/docs/import,但似乎找不到我需要的文档。

例如在我的excel文件中第一行JohnKennedyMale 在我的数据库中对应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();
    } 
}

【问题讨论】:

    标签: excel import laravel-5 laravel-excel


    【解决方案1】:

    鉴于您的 excel 工作表列名与数据库列名完全相同,以下就足够了,

    添加以下控制器类,

    use Maatwebsite\Excel\Facades\Excel;
    use Illuminate\Support\Facades\Input;
    

    及功能码,

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

    更新

    假设您在工作簿中有多个工作表,您将有额外的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

    请注意,默认情况下 - 从 Excel 表中提取数据后,所有列名都将转换为小写,名称之间的所有空格都将替换为下划线。

    【讨论】:

    • 嗨。感谢您的帮助,在看到您的答案之前我已经解决了我的问题,但是您的 User::firstOrCreate($row);帮助我获得了更清晰的代码。而不是像 $customer->title = $value['title']; 这样分配每个值谢谢!我会接受这个:)
    • @pinkalvansia 如果有 2 张或更多张纸怎么办?因为,根据您的代码,foreach 只会占用第一张纸,对吧?
    • @pinkalvansia 非常感谢。但是我只有一张,所以没关系,但无论如何谢谢,我以后可以参考这个。
    • 我想知道如何将 excel 导入现有记录的现有表中。尽管 excel 工作表没有包含现有表上的所有列名,但列名也与表上一样。
    • 如果有 8000 行呢?我们如何使用队列?
    【解决方案2】:

    我有这个项目,我应该能够上传一个 excel 文件并读取内容,然后将信息上传到数据库。所以我决定使用一个库来帮助我找出结果是什么

    <?php
    
    namespace App\Imports;
    
    use App\Models\aas;
    use Illuminate\Support\Collection;
    use Illuminate\Support\Facades\DB;
    use Maatwebsite\Excel\Concerns\ToCollection;
    
    
    class Lecture implements ToCollection
    {
        /**
        * @param Collection $collection
        */
        public function collection(Collection $collection)
        {
            $t=count($collection[0]);
            foreach ($collection as $row) 
            {
                
                for ($i=0; $i < $t; $i++) { 
                    if ($i==0) {
                        $ver=mb_strstr( $row[$i], '2021' );
                        if($ver==FALSE) break;
                    }
                    if (!empty($row[$i])) {
                        
                        switch ($collection[0][$i]) {
                            case 'Ag':
                                
                               aas::create([
                                    'ref' => $row[0],
                                    'lect' => $row[$i],
                                    'code' => 9,
                                    ]);
                                break;
                            case 'Cu':
                               
                                aas::create([
                                    'ref' => $row[0],
                                    'lect' => $row[$i],
                                    'code' => 9,
                                    ]);
                                
                                break;
                            case 'Pb':
                               
                                aas::create([
                                    'ref' =>$row[0],
                                    'lect' =>$row[$i],
                                    'code' => 10,
                                ]);
                                break;
                            case 'Zn':
                               
                                aas::create([
                                    'ref' =>$row[0],
                                    'lect' =>$row[$i],
                                    'code' => 11,
                                ]);
                                break;
                            case 'Mn':
                                
                                aas::create([
                                    'reference_labo' =>$row[0],
                                    'lecture' =>$row[$i],
                                    'code' => 12,
                                ]);
                                break;
                            case 'Co':
                               
                                aas::create([
                                    'ref' =>$row[0],
                                    'lect' =>$row[$i],
                                    'code' => 13,
                                ]);
                                break;
                            case 'Ni':
                                
                                aas::create([
                                    'ref' =>$row[0],
                                    'lect' =>$row[$i],
                                    'code' => 14,
                                ]);
                                break;
                            case 'Fe':
                              
                                aas::create([
                                    'ref' =>$row[0],
                                    'lect' =>$row[$i],
                                    'code' => 15,
                                ]);
                                break;
                        }
                      
                    }
                }
            }
           
        }
    }
    
    

    我的函数执行良好,但数据未在数据库中注册

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2017-04-18
    • 2017-04-24
    相关资源
    最近更新 更多