laravel-导入EXCEL

导入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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在Laravel中实现批量导入Excel,可以使用Laravel-Excel这个包装器。它是一个简单而优雅的Laravel包装器,围绕PhpSpreadsheet(一个流行的PHP库)进行导入和导出。 首先,确保已经安装了Laravel-Excel包。然后,您可以按照以下步骤进行批量导入Excel: 1. 创建一个控制器来处理Excel导入的逻辑。 2. 在控制器中使用`use Maatwebsite\Excel\Facades\Excel`引入Excel门面。 3. 创建一个导入类,继承`Maatwebsite\Excel\Concerns\ToCollection`接口,并实现`collection()`方法。在这个方法中,您可以编写处理导入数据的逻辑。 4. 在控制器的方法中使用`Excel::import()`方法来导入Excel文件,并将导入类的实例作为参数传递给该方法。 5. 在路由中定义一个路由,将请求指向您创建的控制器方法。 以下是一个示例代码,演示了如何在Laravel中批量导入Excel: ```php use App\Imports\UsersImport; use Maatwebsite\Excel\Facades\Excel; class UserController extends Controller { public function import() { Excel::import(new UsersImport, 'users.xlsx'); // 导入成功后的逻辑 return redirect()->back()->with('success', 'Excel导入成功.'); } } ``` 在上面的示例中,我们在控制器的`import()`方法中使用`Excel::import()`方法来导入Excel文件。`UsersImport`是一个自定义的导入类,它实现了`ToCollection`接口。您可以在`UsersImport`类的`collection()`方法中编写处理导入数据的逻辑。 请确保您已经根据您的需求自定义了适合您的导入类,并将Excel文件的路径作为第二个参数传递给`Excel::import()`方法。 不要忘记在路由中定义一个路由,将请求指向您的控制器方法。 请注意,这只是一个示例代码,您可能需要根据您的实际应用程序进行适当的修改和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Github每日精选(第29期):LaravelExcel 导出和导入Laravel-Excel](https://blog.csdn.net/weixin_40425640/article/details/126053684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [laravel Excel 3.1 使用教程 (导入篇)](https://blog.csdn.net/zfj915752851/article/details/103494400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柴没吃饱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值