读取excel文件并上传到数据库Laravel 5
Posted
技术标签:
【中文标题】读取excel文件并上传到数据库Laravel 5【英文标题】:Reading excel file and uploading to database Laravel 5 【发布时间】:2015-10-01 09:18:21 【问题描述】:我有这个项目,我应该能够上传一个 excel 文件并读取内容,然后将信息上传到数据库。所以我决定使用一个库来帮助我找出它原来是Maatwebsite/Laravel-Excel
但我尝试阅读文档http://www.maatwebsite.nl/laravel-excel/docs/import,但似乎找不到我需要的文档。
例如在我的excel文件中第一行John
、Kennedy
、Male
在我的数据库中对应First Name
、Last Name
、Gender
。
如何阅读和上传?有人能帮我吗?
谢谢!
我现在的代码
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();
【问题讨论】:
【参考方案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以上是关于读取excel文件并上传到数据库Laravel 5的主要内容,如果未能解决你的问题,请参考以下文章