Leer un archivo de excel con laravel

publicado por: Anonymous

Necesito sacar las filas/campos de un archivo que subo de excel a mi proyecto laravel, realicé el código de cargar a mi base de datos directamente con laravel excel 3.1, pero lo que necesito es sacar los datos para luego ingresarlos yo por medio de un insert en la parte de los values. Además en el excel van varios datos (varias filas). Entonces ¿ Cómo se podría elaborar ese insert ?

Agrego el código de mi controlador (import):

namespace AppImports;

 use Apptbl_instrumentos;
 use MaatwebsiteExcelConcernsToModel;

class InstrumentosImport implements ToModel
 {

public function model(array $row)
{
    return new tbl_instrumentos([
        'ins_codigo'   => $row[0],
        'ins_observacionInicial'   => $row[1],
        'ins_claseOexactitud'    => $row[2],
    ]);
 }
}

Adicionalmente agrego el código de mi controlador principal:

class TestController extends Controller
{

public function importExportView()
{
   $data=DB::table('tbl_instrumentos')->orderBy('ins_id','DESC')
            ->get();
    return view('importar',compact('data'));
}

/**
* @return IlluminateSupportCollection
*/
public function exportExcel($type) 
{
    return Excel::download(new InstrumentosExport, 'instrumentos.'.$type);
}

/**
* @return IlluminateSupportCollection
*/
public function importExcel(Request $request) 
{
   $this->validate($request, [
  'select_file'  => 'required|mimes:xls,xlsx'
 ]);
    Excel::import(new InstrumentosImport,$request->import_file);

     return back()->with('success', 'Datos Excel Importados Satisfactoriamente.');
}

El import_file que tengo en mi controlador (import) viene de mi vista por medio de un input el cual es el siguiente:

    <input type="file" name="import_file" />

solución

Revisando un poco la documentación, tu utilizas la importación a modelo, podrías hacer un insert con query builder tal cómo ahora creas un modelo:

namespace AppImports;

 use Apptbl_instrumentos;
 use MaatwebsiteExcelConcernsToModel;
use IlluminateSupportFacadesDB;

class InstrumentosImport implements ToModel
 {

public function model(array $row)
{
    DB::table('Tu_Tabla')->insert([
        'columna' => 'valor'
        ...    
    ]);
 }
}

Pero realmente viendo el caso de uso que quieres deberías valorar usar la importación de una colección (import to collection).

De tal forma que tu ejemplo sería:

<?php 
namespace AppImports;

use Apptbl_instrumentos;
use IlluminateSupportCollection;
use IlluminateSupportFacadesDB;
use MaatwebsiteExcelConcernsToCollection;

class InstrumentosImport implements ToModel {

    public function collection(Collection $rows)
    {
        // Opcion 1, mass assignement con eloquent:
        $preparedCollection = $this->prepareCollection($rows);
        tbl_instrumentos::insert($preparedCollection);

        // Opcion 2, con queryBuilder insertando row by row (tambien puedes hacer mass assignement):
        $preparedCollection->each(static function ($row){
            DB::table('Tu_tabla')->insert($row);
        })

    }

    private function prepareCollection(Collection $collection)
    {
        return $collection->map(static function($row){
            return [
                'columna' => $row['key']
                ...
            ];
        });
    }
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *