laravel 操作excel

安装

composer require maatwebsite/excel

在 config/app.php 中注册服务提供者到 providers 数组:

Maatwebsite\Excel\ExcelServiceProvider::class,

在 config/app.php 中注册到 aliases 数组

'Excel' => Maatwebsite\Excel\Facades\Excel::class,

发布 Laravel Excel 的配置文件

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

新建一个导入文件

php artisan make:import UserImport --model=User
//此操作会在 app / 下创建一个 Import 目录并创建一个文件
/**
├── app
│   ├── Imports
│   │   ├── UserImport.php
└── composer.json
*/

我这里需要导入的数据需要自己处理一下,所以使用的 ToCollection 的方法
UserImport.php

namespace App\Imports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Collection;

class CompanyUserImport implements ToCollection
{
    /**
     * 使用 ToCollection
     * @param array $row
     *
     * @return User|null
     */
    public function collection(Collection $rows)
    {
        foreach ($rows as $row)
        {
            // dump($row);
            // 处理数据
        }
        User::insert($data);
    }

    public function createData($rows)
    {
        //todo
    }
}

控制器调用
UserController.php

use App\Imports\UserImport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Http\Request;

    /**
     * excel批量导入成员
     *
     * @param Request $request
     * @return void
     */
    public function importMember(Request $request)
    {

        Excel::import(new UserImport, request()->file('excelfile'));
    }

如果只需要把 excel 的内容拿出来自行做处理的话,只需把调用方式改为以下例子即可

//转为数组
$excelData = Excel::toArray(new UserImport, request()->file('excelfile'));

//转为对象
$excelData = Excel::toCollection(new UserImport, request()->file('excelfile'));

dd($excelData);

科学计数问题
在vendor/maatwebsite/excel/src/DefaultValueBinder.php中添加以下代码

use PhpOffice\PhpSpreadsheet\Cell\DataType;

public function bindValue(Cell $cell, $value)
    {
        if (is_array($value)) {
            $value = \json_encode($value);
        }
        //防止科学计数
        if (strlen($value) > 10) {
            $cell->setValueExplicit($value, DataType::TYPE_STRING);
            return true;
        }

        return parent::bindValue($cell, $value);
    }

时间格式问题
定义在公共函数里面,在需要的地方直接调用

use Carbon\Carbon;
use PhpOffice\PhpSpreadsheet\Shared\Date;

/**
*    转换时间格式
*    @params $value 值
*    @params $format 转换的格式
*/
function transformDateTime(string $value, string $format = 'Y-m-d')
{
        try {
            return Carbon::instance(Date::excelToDateTimeObject($value))->format($format);
        } catch (\ErrorException $e) {
            return Carbon::createFromFormat($format, $value);
        }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!