Reputation: 34914
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
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
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
Reputation: 2353
Create Import File using below command.
php artisan make:import TestImport
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; } }
In Controller make changes like this:
// original code: $rows = Excel::import(new TestImport, 'test.xlsx');
$rows = Excel::toCollection(new TestImport, 'test.xlsx');
Upvotes: -1
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
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
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
Upvotes: 12
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