Импортировать Excel и вставить в базу данных - PullRequest
0 голосов
/ 28 октября 2019

Как импортировать файл Excel и добавить данные в базу данных? У меня есть логика в контроллере (я думаю), но я не уверен, как отправить его из vue в контроллер? Я основываю этот код на другом проекте, над которым я работал, и на учебных пособиях, но я не знаю, как адаптировать его к моему проекту.

Это функция хранилища контроллеров

public function store(Request $request)
{
    ini_set('max_execution_time', 300);
    $users = $request->all();
    try {
        DB::beginTransaction();
        foreach ($users as $user) {
            $dbUser = $this->getUser($user['CARNET']);
            Log::error($dbUser);
            $dbUser->name = $user['NOMBRE'];
            $dbUser->card = $user['CEDULA'];
            $dbUser->scard = $user['CARNET'];
            $dbUser->email = $user['CORREO'];
            $dbUser->password = $user['PASSWORD'];

            $this->isSet('TIPO-USUARIO', $user);
            $user_type_id = $this->getUserId($user['TIPO-USUARIO']);
            $dbUser->user_type_id = $user_type_id->id;

            $dbUser->save();

            foreach (explode(',', str_replace(' ', '', $user['CATEGORIA-USUARIO'])) as $c) {
                $category = $this->getCategory($c);
                $dbUser->userCategory()->save($category);
            }

            $dbUser->save();
        }
        DB::commit();
    } catch (Exception $e) {
        DB::rollBack();
        throw new HttpException(500, 'Sucedio un error importando la información favor intentar de nuevo');
    }
}

Что у меня есть в моем vue

<input type="file" name="file" class="inputfile" id="fileUpload"/>
<label for="fileUpload">Select Excel</label>

<el-button
    style="margin: 5px; margin-left: 20px"
    type="primary"
    class="mt-1"
    :loading="loading"
    @click="sendData()">Import
</el-button>
sendData(data) {
    this.loading = true;
    this.error = {};
    this.$http.post(this.baseUrl, data, this.params)
        .then(
            () => {
                this.successAction();
                this.errorDis = false;

            },
            (res) => {
                this.showErrors(res);
                 this.errorDis = true;
            }
        );
},
successAction() {
    this.loading = false
},
showErrors(res) {
    const [message, errors] = parseError(res);
    this.error = {
        message,
        errors
    };
    this.loading = false;
    this.processing = false;
},

Я не уверен, как отправить фактические данные на контроллер, чтобы иметь возможность их сохранить.

1 Ответ

0 голосов
/ 28 октября 2019

Вы можете использовать Laravel-Excel , чтобы прочитать файл, создать объект или массив и сохранить данные в нужной таблице. В представлении (blade, vue, jQuery и т. Д.) Вы просто должны отправить файл как POST через маршрут, подобный следующему:

Route::post('/importExcel', 'YourController@importExcelmethod');

В контроллере вы можете сделать что-то вроде этого:

public function importExcel(Request $request)
{
    if($request->file('import_file')){
        $path = $request->file('import_file')->getRealPath();
        $data = Excel::selectSheetsByIndex(0)->load($path, function($reader) {
        })->get()->toArray();
        if(!empty($data) && (count($data)> 0)){
            foreach ($data as $key => $value) {
                DB::table('your_table')->insert(
                    [
                        "a_column" => $value[0],
                        "another_comun" => $value[1],
                        //etc
                    ]
                );
            }

Более подробная информация здесь и примеры здесь: https://docs.laravel -excel.com / 3.1 / import /

На самом деле есть несколько простых примеров того, как хранить данные в модели изxls, как это:

public function import() 
{
    Excel::import(new UsersImport, 'users.xlsx');

    return redirect('/')->with('success', 'All good!');
}
...