光羽 Blog

记录精彩的程序人生

Programs must be written for people to read, and only incidentally for machines to execute.
程序必须是为了给人看而写,给机器去执行只是附带任务.
  menu
9 文章
1530 浏览
0 当前访客
ღゝ◡╹)ノ❤️

记录Excel导入……

记录使用Excel导入数据

前提

项目使用 laravel-admin 上传文件

	$form->file('file_name', __('File'))->name(function ($file) {
            return time() . '_' . Admin::user()->id . '.' . $file->guessExtension();
        })
            ->removable()->options([
            'allowedFileExtensions' => ['xls', 'xlsx'],
        ]);
        $form->submitted(function (Form $form) {
            $form->model()->admin_id = Admin::user()->id;
        });

上传文件一定是xls或者xlsx
上传之后,存储在/public/upload/files
image.png

工具

使用laravel 的Excel拓展

compser require maatwebsite/excel

Provider会自动发现……就不用加到config/app.php
要发布配置,请运行vendor publish命令:

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

顺便加个alias

// config/app.php

aliases => [
	...
        'Excel'        => Maatwebsite\Excel\Facades\Excel::class,
]

调用队列

使用database 作为queue driver

php artisan queue:table && php artisan migrate

然后创建job

php artisan make:job ImportExcel

在上传文件到服务器之后,使用

ImportExcel::dispatch($form->file_name);

………………
这里报了个image.png

经检测,$form->file_name为文件实例,而Queue不允许这样操作,看来只能传路径,于是

	$form->saved(function (Form $form){
            ImportExcel::dispatch($form->model()->file_name);
        });

在这之前,差点忘了php artisan queue:work or queue:listen
这里Queue就通过测试

image.png

任务逻辑

导入excel很简单,创建import类

php artisan make:import PeopleImport --model=Person

在过程中遇到了中文无法读取的问题,通过修改配置解决

        'heading_row' => [

            /*
            |--------------------------------------------------------------------------
            | Heading Row Formatter
            |--------------------------------------------------------------------------
            |
            | Configure the heading row formatter.
            | Available options: none|slug|custom
            |
             */
            'formatter' => 'none',
        ],

最终代码如下

class PeopleImport implements ToModel, WithHeadingRow, WithBatchInserts,WithChunkReading
{

    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function model(array $row)
    {
        $personData = [
            'name' => $row['姓名'] ?? $row['名字'] ?? $row['name'] ?? $row['Name'] ?? null,
            'tel'  => $row['电话'] ?? $row['Tel'] ?? $row['tel'] ?? $row['phone'] ?? $row['Phone'] ?? null,
        ];
        $person = Person::firstOrNew($personData);
        if ($person->id != null){
            return null;
        }

        return new Person($personData);
    }
    // 多少条存一次
    public function batchSize(): int
    {
        return 1000;
    }
    // 读取块大小
    public function chunkSize(): int
    {
        return 1000;
    }
}

测试了一下上传了excel ,果然导入成功!!
image.png


标题:记录Excel导入……
作者:lty5240
地址:http://blog.lintyone.cn/articles/2019/09/12/1568271613052.html
Programs must be written for people to read, and only incidentally for machines to execute.
程序必须是为了给人看而写,给机器去执行只是附带任务.