Пустые файлы при экспорте в Excel в Laravel

#php #laravel #laravel-8 #maatwebsite-excel

Вопрос:

У меня есть страница, которая позволяет пользователю выбрать сотрудника и диапазон дат(от и до). Затем они могут фильтровать записи на основе этого. Я хочу иметь возможность экспортировать данные в формат Excel, но когда я нажимаю «Экспорт», он загружает пустую электронную таблицу. Может ли кто-нибудь, пожалуйста, помочь мне найти мою проблему здесь.

Контроллер:

 public function exportvehicles(Request $request) {  $startDate = $request-gt;startDate;  $endDate = $request-gt;endDate;    return Excel::download(new ExportV($startDate, $endDate), 'excelname.xlsx'); }  

Модель:

 class ExportV implements FromQuery {  /**  * @return IlluminateSupportCollection  */    use Exportable;   protected $startDate;  protected $endDate;   function __construct($startDate,$endDate) {  $this-gt;startDate = $startDate;  $this-gt;endDate = $endDate;  }   public function query()  {  $startDate = request()-gt;input('startDate', '2021-01-01');  $endDate = request()-gt;input('endDate', '2021-12-12');  $data = VehicleLog::join('vehicle', 'vehicleslog.vehicle_id', '=', 'vehicle.id')  -gt;join('smsstaff', 'vehicleslog.smsstaff_key', '=', 'smsstaff.smsstaff_key')  -gt;when(request()-gt;input('smsstaff_key'), function ($query) {  $query-gt;where('smsstaff.smsstaff_key', request()-gt;input('smsstaff_key'));  })  -gt;whereDate('log_dt', 'gt;=', $startDate)  -gt;whereDate('log_dt', 'lt;=', $endDate)  -gt;get();   return $data;  }  }  

Вид:

 lt;labelgt;Pick a staff memberlt;/labelgt;  lt;select name="smsstaff_key" id="smsstaff_key"gt;  lt;optiongt;----------------Select-----------------lt;/optiongt;  @foreach ($staff as $staffMember)   lt;option value="{{$staffMember-gt;smsstaff_key}}" {{request()-gt;input('smsstaff_key') === $staffMember-gt;smsstaff_key ? 'selected="selected"' : ''}}gt;{{$staffMember-gt;name}}lt;/optiongt;  @endforeach  lt;/selectgt;  lt;button class="btn btn-primary"gt;Filter by selected staff memberlt;/buttongt;   lt;/divgt; lt;div style="margin-left: 100px;"gt;  lt;labelgt;From:lt;/labelgt;  lt;input type="date" class="form-control" name="startDate" value="{{ $startDate }}"gt; lt;/divgt; lt;div style="margin-left: 150px;"gt;  lt;labelgt;To:lt;/labelgt;  lt;input style="width: 14em" type="date" class="form-control" name="endDate" value="{{ $endDate }}"gt; lt;/divgt; lt;a href="{{"/users/export/"}}" target="_blank" class="btn btn-primary"gt;Export to Excellt;/agt;  

Маршрут:

 Route::get('users/export/', 'AppHttpControllersAdminReportController@exportvehicles');  

Комментарии:

1. если вы выполняете toSql в своем запросе, получаете ли вы результаты из своей базы данных?

2. @Thomas Хорошо, я удалил get() и экспортировал, но он экспортирует все записи. Есть ли способ заставить его экспортировать только отфильтрованные?

3. Попробуйте отправить свой ввод в виде формы. Фильтрация не работает, потому что вы отправляете входные данные в приложение

4. @ManojKiranAppathurai Как бы я это сделал?

5. можете ли вы опубликовать код маршрута для операции экспорта ?

Ответ №1:

Когда вам нужно отправить значения на сервер, вам нужно отправить их в виде формы.

 //web.php Route::post('users/export/', 'AppHttpControllersAdminReportController@exportvehicles')-gt;name('exportVehiclesToExcel');  

Вид:

 lt;form action="{{route('exportVehiclesToExcel')}}" method="POST"gt;  lt;labelgt;Pick a staff memberlt;/labelgt;  lt;select name="smsstaff_key" id="smsstaff_key"gt;  lt;optiongt;----------------Select-----------------lt;/optiongt;  @foreach ($staff as $staffMember)  lt;option value="{{$staffMember-gt;smsstaff_key}}" {{request()-gt;input('smsstaff_key') === $staffMember-gt;smsstaff_key ? 'selected="selected"' : ''}}gt;{{$staffMember-gt;name}}lt;/optiongt;  @endforeach  lt;/selectgt;  lt;button class="btn btn-primary"gt;Filter by selected staff memberlt;/buttongt;   lt;/divgt;  lt;div style="margin-left: 100px;"gt;  lt;labelgt;From:lt;/labelgt;  lt;input type="date" class="form-control" name="startDate" value="{{ $startDate }}"gt;  lt;/divgt;  lt;div style="margin-left: 150px;"gt;  lt;labelgt;To:lt;/labelgt;  lt;input style="width: 14em" type="date" class="form-control" name="endDate" value="{{ $endDate }}"gt;  lt;/divgt;  lt;button type="submit"gt;Export to Excellt;/buttongt; lt;/formgt;  

Контроллер:

 public function exportvehicles(Request $request) {  $startDate = $request-gt;startDate; $endDate = $request-gt;endDate; $smsStaffKey = $request-gt;smsstaff_key   return Excel::download(new ExportV($startDate, $endDate, $smsStaffKey), 'excelname.xlsx'); }  

Класс экспорта Excel

 class ExportV implements FromQuery {   use Exportable;   public $startDate;  public $endDate;  public $smsStaffKey;   function __construct($startDate, $endDate, $smsStaffKey = null)  {  $this-gt;startDate = $startDate;  $this-gt;endDate = $endDate;  $this-gt;smsStaffKey = $smsStaffKey;  }   public function query()  {  $startDate = $this-gt;startDate;  $endDate = $this-gt;endDate;  $data = VehicleLog::join('vehicle', 'vehicleslog.vehicle_id', '=', 'vehicle.id')  -gt;join('smsstaff', 'vehicleslog.smsstaff_key', '=', 'smsstaff.smsstaff_key')  -gt;when($this-gt;smsStaffKey, function ($query) {  $query-gt;where('smsstaff.smsstaff_key', $this-gt;smsStaffKey);  })  -gt;whereDate('log_dt', 'gt;=', $startDate)  -gt;whereDate('log_dt', 'lt;=', $endDate);   return $data;  } }  

Прокомментируйте, если возникнут какие-либо проблемы

Комментарии:

1. там написано The POST method is not supported for this route. Supported methods: GET, HEAD. . Есть идеи, почему?

2. обновил свой код в маршрутах