Niklesh Raut
Niklesh Raut

Reputation: 34914

How to get excel to array in maatwebsite

I am trying to convert an Excel file to an array using the latest version of Laravel-Excel (3.1.9)

The code below will download the file:

return Excel::download(new SalesOrderExport('columns'),'test.xlsx')

But I need to convert it to get an array only. I don't want to store this Excel data in a database at this point.

I tried with the code below but it did not work as the load method is not available in version 3.

Excel::load($request->file('sampledata'), function ($reader) {
    return response()->json($reader);
});

Please share your thoughts on how to get an array from Excel.

Upvotes: 10

Views: 61346

Answers (7)

Davidesk
Davidesk

Reputation: 21

I tried something like this and it worked perfectly; in your import file do this

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;

public function collection(Collection $row)
{
    return $row;
}

Then in the controller, do this;

$row = Excel::toCollection(new CourseImport, request()->file('course'));

Upvotes: 1

omarjebari
omarjebari

Reputation: 5499

Here are some working examples based on importing a csv file using the usual file input element. In my case, once uploaded, the file is accessible through the request object as 'csv_file'.

public function importCSV(Request $request)
{
    // Get the csv rows as an array
    $theArray = Excel::toArray(new stdClass(), $request->file('csv_file'));

    // Get the csv rows as a collection
    $theCollection = Excel::toCollection(collect([]), $request->file('csv_file'));

    //etc
}

Upvotes: 5

narayansharma91
narayansharma91

Reputation: 2353

  1. Create Import File using below command.

    php artisan make:import TestImport

  2. Inside TestImport make changes like this:

    namespace App\Imports;

    use App\User; use Illuminate\Support\Collection; use Maatwebsite\Excel\Concerns\ToCollection;

    class TestImport implements ToCollection { public function collection(Collection $rows) { return $rows; } }

  3. In Controller make changes like this:

    // original code: $rows = Excel::import(new TestImport, 'test.xlsx');

    $rows = Excel::toCollection(new TestImport, 'test.xlsx');

Upvotes: -1

Maniruzzaman Akash
Maniruzzaman Akash

Reputation: 5025

I'm adding it on hope that someone could get another types of solution for this. Version - "maatwebsite/excel": "^3.1"

In Controller

$data = Excel::toArray(new UsersImport(), $request->file);

In UsersImport

<?php
    namespace App\Imports;
    use Illuminate\Support\Collection;
    use Maatwebsite\Excel\Concerns\ToCollection;

    class UsersImport implements ToCollection
    {
       public function collection(Collection $rows)
       {
       }
    }

Json Array Result

array:2 [▼
  0 => array:2 [▼
           0 => "+126785XXXXX"
           1 => "Jhon"
       ]
  1 => array:2 [▼
           0 => "+126784XXXXX"
           1 => "Doe"
       ]
  ]

And One Bonus, Now suppose you just need the phone numbers, then make a custom array from that in controller-

$data = Excel::toArray(new UsersImport(), $request->file);
$phoneNumbersData= [];
foreach ($data[0] as $key => $value) {
  $phoneNumbersData[] = $value[0];
}
return $phoneNumbersData;

Hope, this will help someone.

Upvotes: 11

user5832543
user5832543

Reputation:

Here is how I achieved this:

In my UsersImport class: namespace App\Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\Importable;

class UsersImport implements ToModel
{
    use Importable;

    public function model(array $row)
    {
        return new User([
           'id' => $row[0]
        ]);
    }
}

And in controller:

$imported_users = (new UsersImport)->toArray(request()->file('excel_file'))[0];

I hope it helps you.

Upvotes: 0

Niklesh Raut
Niklesh Raut

Reputation: 34914

I and @narayan tried hard to make requested excel file into array. Now I am able to get array properly with below code

$rows = Excel::toArray(new SalesOrderImport, $request->file('sampledata')); 

In my SalesOrderExport class I have default function only, which is required as abstract method.

namespace App\Exports;

use App\SalesOrder;
use Maatwebsite\Excel\Concerns\FromCollection;

class SalesOrderExport implements FromCollection
{
    public function collection()
    {   
        return SalesOrder::all();
    }
}

My Controller code

public function importTest(Request $request)
{
    $rows = Excel::toArray(new SalesOrderImport, $request->file('sampledata'));
    return response()->json(["rows"=>$rows]);
}

And in HTML

<input class="" type="file" name="sampledata" id="sampledata">

I already created this export by

php artisan make:import SalesOrder

Attaching related images

enter image description hereenter image description here

Upvotes: 12

AddWeb Solution Pvt Ltd
AddWeb Solution Pvt Ltd

Reputation: 21681

You should try this:

$data = Excel::load($request->file('sampledata'), function ($reader) use($table) {
        $data = $reader->toArray();
        //here data has all excel data in array.
});

Upvotes: -1

Related Questions