如果需要将表数据导入到Excel, 或者需要将Excel的内容导入到数据库中,这就需要使用maatwebsite/excel 插件了
首先运行命令进入到容器内
docker-compose exec --user=laradock workspace dash
然后切换到项目根录下
cd projectfolder
然后运行依赖命令
composer require maatwebsite/excel
安装成功后,我们先创建一个导出Excel的接口类
php artisan make:export TestExport --model=TestDemo
这里的TestExport是自定义类名, TestDemo是指要导出数据的表所对应的model
运行后会在app/Exports目录下创建一个名为TestExport的类,如下
namespace App\Exports;
use App\Models\TestDemo; // 注意如果model是在某个自定义目录下,这里需要修改
use Maatwebsite\Excel\Concerns\FromCollection;
class TestExport implements FromCollection
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return TestDemo::all();
}
}
然后在controller里引用这个借口类,并调用导出方法,导出功能已实现
use App\Exports\TestExport;
public function exportDataToExcel()
{
return Excel::download(new TestExport, 'test.xlsx');
}
如果需要将Excel的内容导入到表中,同样需要创建一个导入的接口类
php artisan make:import TestImport --model=TestDemo
运行后会在app/Imports目录下创建一个名为TestImport的类,如下
namespace App\Imports;
use App\Models\TestDemo;
use Maatwebsite\Excel\Concerns\ToModel;
class TestImport implements ToModel
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new TestDemo([
//
]);
}
}
这里我们将这个类进行优化一下,当Excel内的数据在表里已存在, 就不重复插入了
namespace App\Imports;
use App\Models\TestDemo;
use Maatwebsite\Excel\Concerns\ToModel;
class TestImport implements ToModel
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
$data = [
'name' => $row[1],
'age' => $row[2],
'date' =>$row[3],
];
$result = TestDemo::where($data)->first();
if (empty($result)) {
return new TestDemo($data);
} else {
return null;
}
}
}
model(array $row)方法里的$row代表Excel的一行数据的数组
我们先根据条件查询这条数据在表内是否存在,如果存在,返回null,什么也不做
如果数据不存在表内,就插入这条数据
这里要说明一下, 对model进行插入操作, 需要在model里设置一下$fillable, 如下
protected $fillable = [
'name',
'age',
'date'
];
这时候在controller引入这个导入数据的接口类,并调用其方法将数据插入表中
use App\Imports\TestImport;
public function importDataFromExcel(Request $request)
{
$fileObj = $request->file('excel-file');
Excel::import(new TestImport, $fileObj);
}
这里通过form表单提交获取到Excel的文件对象,然后调用import来导入数据