Laravel-Excel应该算是目前接触过的,最好用的excel工具包。
之前用过PHPExcel类库,项目中使用时会将PHPExcel类库放到扩展目录vendor中,然后直接调用。但是并没有Laravel-Excel用起来顺手,可能是因为Laravel-Excel与Laravel框架本身足够契合的原因吧。
安装Laravel-Excel
composer require maatwebsite/excel
Excel导出
php artisan make:export ItemsTemplateExport --model=Models/Item
创建的export文件在app/Exports目录下
可以使用集合类collection形式,也可以使用数组array形式,这里我以数组形式举例
namespace App\Exports;
use App\Models\Item;
use Maatwebsite\Excel\Concerns\FromArray;
class ItemsTemplateExport implements FromArray
{
public function array(): array
{
return [
['***', '***']
];
}
}
控制类中引用后直接使用
use App\Imports\ItemsImport;
use Maatwebsite\Excel\Facades\Excel;
class ItemsController extends Controller
{
public function itemsTemplateExport()
{
return Excel::download(new ItemsTemplateExport, 'items.xlsx');
}
}
Excel导入
php artisan make:import ItemsImport --model=Models/Item
有点多,裁剪下直接贴代码了,数据量比较大时建议切割数据分块导入
<?php
namespace App\Imports;
use App\Models\Item;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithValidation;
class ItemsImport implements ToModel, WithBatchInserts, WithChunkReading, WithHeadingRow, WithValidation
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
// dd($row);
return new Item([
*
*
*
]);
}
public function rules(): array
{
return [
*
*
*
];
}
public function customValidationMessages()
{
return [
*
*
*
];
}
//批量导入1000条
public function batchSize(): int
{
return 1000;
}
//以1000条数据基准切割数据
public function chunkSize(): int
{
return 1000;
}
}
控制类中引用后直接使用
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Exports\ItemsTemplateExport;
use Maatwebsite\Excel\Facades\Excel;
class ItemsController extends Controller
{
public function import(Request $request)
{
if (empty($request->items)) {
return redirect()->back()->with('danger', '未找到excel文件。');
}
Excel::import(new ItemsImport, $request->items);
return redirect()->back()->with('success', '导入成功!');
}
}