Laravel 8 表数据通过Excel的导入和导出

如果需要将表数据导入到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来导入数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值