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 协议》,转载必须注明作者和本文链接