突然有一天,我的包子铺的员工对我有所不满,于是动手把我的excel表格的一些金额改成了负数,日期也被动了手脚,那肯定不行啊,当务之急就是找出这些负数的金额和这些奇怪的日期,我们姑且称之为坏账吧。
于是我在我的AccountImport中加入了两条验证规则,由于老猫的英语不太好,于是不得不加入些中文提示来告诉我。这时我是这样做的。
<?php
namespace App\Imports;
use App\Models\Account;
use Illuminate\Validation\Rule;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\RemembersRowNumber;
use Maatwebsite\Excel\Concerns\WithValidation;
class AccountImport implements ToModel,WithBatchInserts,WithChunkReading, WithValidation
{
use RemembersRowNumber;
/**
* @param array $row
*
* @return Account|null
*/
public function model(array $row)
{
$currentRowNumber = $this->getRowNumber();
echo $currentRowNumber."\r\n";
if (!is_numeric($row[1])) {
return null;
}
return new Account([
'date' => $row[0],
'money' => $row[1],
]);
}
public function batchSize(): int
{
return 1000;
}
public function chunkSize(): int
{
return 50;
}
public function rules(): array
{
return [
'0' => 'date',
'1' => 'min:0',
];
}
public function customValidationMessages()
{
return [
'0.date' => '必须是日期格式',
'1.min' => '必须是大于0的金额'
];
}
}
我尝试运行一下,发现果然有异常抛出 ValidationException,于是我们在导入的地方也需要相应地做些改造,以保证正常。 ExcelRead.php
<?php
namespace App\Console\Commands;
use App\Imports\AccountImport;
use Illuminate\Console\Command;
use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\Validators\ValidationException;
class ExcelRead extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:ExcelRead';
/**
* The console command description.
*
* @var string
*/
protected $description = '操作excel';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
try{
Excel::import(new AccountImport(), public_path('test.xlsx'));
}catch( ValidationException $e){
var_dump($e->failures());
// foreach ($failures as $failure) {
// $failure->row(); // row that went wrong
// $failure->attribute(); // either heading key (if using heading row concern) or column index
// $failure->errors(); // Actual error messages from Laravel validator
// $failure->values(); // The values of the row that has failed.
// }
}
}
}
说完了导入的所有问题之后,我们下次来介绍下导出会遇到的各种问题以及怎么去使用它的导出功能。老猫的包子铺会火吗?尽情期待。如果你在使用过程中有任何问题,欢迎留言和我一起探讨。