Я пытаюсь разрешить пользователям загружать Excel, используя файлы Ларавель Эксель с информацией о продукте. Мой текущий веб-маршрут выглядит так:
Route::get('/excel/release', 'ExcelController@create')->name('Create Excel');
Мой текущий экспорт выглядит так:
class ProductExport implements FromQuery
{
use Exportable;
public function __construct(int $id)
{
$this->id = $id;
}
public function query()
{
return ProductList::query()->where('id', $this->id);
}
}
Мой текущий контроллер выглядит так:
public function create(Request $request) {
# Only alowed tables
$alias = [
'product_list' => ProductExport::class
];
# Ensure request has properties
if (!$request->has('alias') || !$request->has('id'))
return Redirect::back()->withErrors(['Please fill in the required fields.'])->withInput();
# Ensure they can use this
if (!in_array($request->alias, array_keys($alias)))
return Redirect::back()->withErrors(['Alias ' . $request->alias . ' is not supported'])->withInput();
# Download
return (new ProductExport((int) $request->id))->download('iezon_solutions_' . $request->alias . '_' . $request->id . '.xlsx');
}
Когда я перехожу к https://example.com/excel/release?alias=product_list&id=1, он выполняется правильно и возвращает файл Excel. Однако для строк нет заголовков столбцов. Данные выходят так:
1 150 1 3 2019-01-16 16:37:25 2019-01-16 16:37:25 10
Однако он должен содержать заголовки столбцов, такие как идентификатор, стоимость и т. д. Как я могу включить заголовки столбцов в этот вывод?






В соответствии с документация вы можете изменить свой класс для использования интерфейса WithHeadings, а затем определить функцию headings для возврата массива заголовков столбцов:
<?php
namespace App;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
class ProductExport implements FromQuery, WithHeadings
{
use Exportable;
public function __construct(int $id)
{
$this->id = $id;
}
public function query()
{
return ProductList::query()->where('id', $this->id);
}
public function headings(): array
{
return ["your", "headings", "here"];
}
}
Это работает со всеми типами экспорта (FromQuery, FromCollection и т. д.)
Если вы экспортируете все столбцы таблицы: stackoverflow.com/a/37157879/1255289
как мне вызвать метод заголовков в контроллере?
@ miken32 miken32 Есть ли способ передать массив в заголовки из функций query или хотя бы обновить его там и сделать доступным для заголовков. На самом деле мне нужно добавлять заголовки, только если в этом столбце есть данные. Итак, есть ли обходной путь для этого?
Это функция. Вы можете делать с ним все, что хотите, @SarojShrestha. Посмотрите на код класса, вероятно, данные — это свойство, к которому вы можете получить доступ.
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use DB;
class LocationTypeExport implements FromCollection,WithHeadings
{
public function collection()
{
$type = DB::table('location_type')->select('id','name')->get();
return $type ;
}
public function headings(): array
{
return [
'id',
'name',
];
}
}
У меня это работало только с :array, вероятно, из-за более новой версии.
<?php
namespace App\Exports;
use App\Models\UserDetails;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
class CustomerExport implements FromCollection, WithHeadings
{
public function collection()
{
return UserDetails::whereNull('business_name')
->select('first_name','last_name','mobile_number','dob','gender')
->get();
}
public function headings() :array
{
return ["First Name", "Last Name", "Mobile","DOB", "Gender"];
}
}
Этот код работает для меня
use App\Newsletter;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class NewsletterExport implements FromCollection, WithHeadings
{
public function headings(): array
{
return [
'Subscriber Id',
'Name',
'Email',
'Created_at',
];
}
public function collection()
{
return Newsletter::where('isSubscribed', true)->get(['id','name','email','created_at']);
}
}
Вы можете комбинировать это с array_keys, чтобы динамически получать заголовки столбцов:
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class ProductExport implements FromQuery, WithHeadings
{
use Exportable;
public function __construct(int $id)
{
$this->id = $id;
}
public function query()
{
return ProductList::query()->where('id', $this->id);
}
public function headings(): array
{
return array_keys($this->query()->first()->toArray());
}
}
Если вы используете его с коллекцией, вы можете сделать это следующим образом:
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class ProductExport implements FromCollection, WithHeadings
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
// for selecting specific fields
//return ProductList::select('id', 'product_name', 'product_price')->get();
// for selecting all fields
return ProductList::all();
}
public function headings(): array
{
return array_keys($this->collection()->first()->toArray());
}
}
<?php
namespace App\Exports;
use App\Models\StudentRegister;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class StudentExport implements FromCollection, WithHeadings
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return StudentRegister::select('name','fname','mname','gender','language','address')->get();
}
public function headings(): array
{
//Put Here Header Name That you want in your excel sheet
return [
'Name',
'Father Name',
'Mother Name',
'Gender',
'Opted Language',
'Corresponding Address'
];
}
}
Хотя этот код может решить вопрос, включение объяснения того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас.
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти дополнительную информацию о том, как писать хорошие ответы в справочном центре.
Спасибо за это! Есть ли способ использовать Eloquent для динамического получения столбцов в базе данных? Я приму, как только смогу!