导入EXCEL
- 视图
<input type="file" id="inputExcel" style="display: none" accept=".xlsx, .xls" data-url="{{url(strtolower($model).'/import')}}"> <button type="reset" class="layui-btn layui-btn-warm" id="import_csv"><i class="layui-icon layui-icon-upload-circle layuiadmin-button-btn"></i>导入</button>
- JS
// EXCEL导入 $(document).on('click', '#import_csv', function () { $('#inputExcel').click(); }); $('#inputExcel').on('change', function (e) { console.log(e); var file = this.files[0]; var formData = new FormData(); formData.append('file', file); var url = $(this).data('url'); // 获取 data-url 属性的值 $.ajax({ url: url, data: formData, type: 'POST', contentType: false, processData: false, dataType: 'json', cache: false, headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, success: function (res) { // 处理上传成功的回调 history.go(0); alert(res.msg); }, error: function (err) { // 处理上传失败的回调 console.error('Upload error:', err); } }); })
- 导入的方法封装在了
Services
,采取注入的方式来实例调用,这里只演示导入
<?php namespace App\Services; use App\Models\Test; use Illuminate\Http\Request; use PhpOffice\PhpSpreadsheet\IOFactory; use Illuminate\Support\Facades\DB; class TestService { public static function import(Request $request) { // 判断当前请求是否为POST请求,并且检查是否存在名为file的上传文件。如果条件成立,则继续执行代码;否则返回错误信息 if ($request->isMethod('post') && $request->hasFile('file')) { // 生成一个唯一的文件名,使用当前时间戳和一个随机数进行MD5加密,最后加上后缀名.xlsx。 $fileName = md5(microtime(true) . mt_rand(1000, 9999)) . '.xlsx'; // 获取应用程序根目录下的/storage/app/public/uploads目录,并将其赋值给变量$root。 $root = storage_path('/public/uploads/'); // 生成一个以当前日期为名称的子目录,用于存放上传的Excel文件。 $savePath = 'importExcel/' . date('Ymd') . '/'; // 将上传文件的路径设置为$root与$savePath的拼接结果。 $path = $root . $savePath; // is_dir查上传文件的目录是否存在,如果不存在则创建该目录。 if (!is_dir($path)) { // mkdir($path, 0777, true) 该方法创建名为$path的目录,并赋予最大的权限 if (false === @mkdir($path, 0777, true) && !is_dir($path)) { throw new \Exception('存储文件夹创建失败:' . $path); } } // 组合出完整的文件路径。 $filePath = $path . $fileName; // 将上传的Excel文件保存到服务器上指定的位置 if ($request->file('file')->move($path, $fileName)) { // 加载Excel文件 $spreadsheet = IOFactory::load($filePath); // 获取第一个工作表 $worksheet = $spreadsheet->getActiveSheet()->toArray(null, true, true, true); // 获取A1单元格的值 // $value = $worksheet->getCell('A1')->getValue(); // 处理Excel文件内容并保存到数据库中 DB::beginTransaction(); try { foreach ($worksheet as $key => $value) { // 跳过表头 if ($key == 1) continue; // 跳过空行 if (empty($value['A'])) continue; $model = new Test; $model['name'] = $value['A']; // 当参数为false时,会禁用数据验证,直接保存数据到数据库中。而当参数为true时,会强制进行数据验证, $model->saveOrFail([ 'timestamps' => false, ]); } DB::commit(); return response()->json(['code' => 0, 'msg' => '文件上传成功']); } catch (\Exception $e) { DB::rollBack(); return response()->json(['code' => 1, 'msg' => $e->getMessage()]); } } else { return response()->json(['code' => 1, 'msg' => '文件上传失败']); } } else { return response()->json(['code' => $request, 'msg' => 'Error!']); } } }
- 调用import方法
<?php namespace App\Http\Controllers\Admin; use App\Helpers\Common; use App\Models\Test; use App\Services\TestService; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class TestController extends BaseController { // 在 `TestController` 中添加一个构造函数,并在其中注入 `TestService` 实例。 protected $testService; public function __construct(TestService $testService) { $this->testService = $testService; } // 导入EXCEL public function import(Request $request) { return $this->testService->import($request); } }