【问题标题】:Empty files when exporting to Excel in Laravel在 Laravel 中导出到 Excel 时为空文件
【发布时间】:2021-12-11 19:31:56
【问题描述】:

我有一个页面,允许用户选择工作人员和日期范围(从和到)。然后,他们可以基于此过滤记录。我希望可以选择将数据导出为 Excel 格式,但是当我单击导出时,它会下载一个空白电子表格。谁能帮我在这里找到我的问题。

控制器:

public function exportvehicles(Request $request)
{
    $startDate = $request->startDate;
    $endDate = $request->endDate;


    return Excel::download(new ExportV($startDate, $endDate), 'excelname.xlsx');
}

型号:

class ExportV implements FromQuery
{
    /**
    * @return \Illuminate\Support\Collection
    */
   
    use Exportable;

    protected $startDate;
    protected $endDate;

    function __construct($startDate,$endDate) {
        $this->startDate = $startDate;
        $this->endDate = $endDate;
    }

    public function query()
    {
        $startDate = request()->input('startDate', '2021-01-01');
        $endDate = request()->input('endDate', '2021-12-12');
        $data = VehicleLog::join('vehicle', 'vehicleslog.vehicle_id', '=', 'vehicle.id')
        ->join('smsstaff', 'vehicleslog.smsstaff_key', '=', 'smsstaff.smsstaff_key')
        ->when(request()->input('smsstaff_key'), function ($query) {
            $query->where('smsstaff.smsstaff_key', request()->input('smsstaff_key'));
        })
        ->whereDate('log_dt', '>=', $startDate)
        ->whereDate('log_dt', '<=', $endDate)
        ->get();

        return $data;
    }

}

查看:

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

路线:

Route::get('users/export/', 'App\Http\Controllers\Admin\ReportController@exportvehicles');

【问题讨论】:

  • 如果对查询执行 toSql,是否会从数据库中获取结果?
  • @Thomas 好的,我删除了 get() 并导出了所有记录。有什么办法让它只导出过滤后的?
  • 尝试以表单形式提交您的输入。过滤不起作用,因为您将输入提交到应用程序
  • @ManojKiranAppathurai 我该怎么做?
  • 能贴出导出操作的路由代码吗?

标签: php laravel laravel-8 maatwebsite-excel


【解决方案1】:

当您需要将值发送到服务器以将其作为表单提交时。

//web.php
Route::post('users/export/', 'App\Http\Controllers\Admin\ReportController@exportvehicles')->name('exportVehiclesToExcel');

查看:

<form action="{{route('exportVehiclesToExcel')}}" method="POST">
    <label>Pick a staff member</label>
    <select name="smsstaff_key" id="smsstaff_key">
        <option>----------------Select-----------------</option>
        @foreach ($staff as $staffMember)
        <option value="{{$staffMember->smsstaff_key}}" {{request()->input('smsstaff_key') === $staffMember->smsstaff_key ? 'selected="selected"' : ''}}>{{$staffMember->name}}</option>
        @endforeach
    </select>
    <button class="btn btn-primary">Filter by selected staff member</button>

    </div>
    <div style="margin-left: 100px;">
        <label>From:</label>
        <input type="date" class="form-control" name="startDate" value="{{ $startDate }}">
    </div>
    <div style="margin-left: 150px;">
        <label>To:</label>
        <input style="width: 14em" type="date" class="form-control" name="endDate" value="{{ $endDate }}">
    </div>
    <button type="submit">Export to Excel</button>
</form>

控制器:

public function exportvehicles(Request $request)
{

$startDate = $request->startDate;
$endDate = $request->endDate;
$smsStaffKey = $request->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->startDate = $startDate;
        $this->endDate = $endDate;
        $this->smsStaffKey = $smsStaffKey;
    }

    public function query()
    {
        $startDate = $this->startDate;
        $endDate = $this->endDate;
        $data = VehicleLog::join('vehicle', 'vehicleslog.vehicle_id', '=', 'vehicle.id')
        ->join('smsstaff', 'vehicleslog.smsstaff_key', '=', 'smsstaff.smsstaff_key')
        ->when($this->smsStaffKey, function ($query) {
            $query->where('smsstaff.smsstaff_key', $this->smsStaffKey);
        })
            ->whereDate('log_dt', '>=', $startDate)
            ->whereDate('log_dt', '<=', $endDate);

        return $data;
    }
}

有什么问题可以留言

【讨论】:

  • 上面写着The POST method is not supported for this route. Supported methods: GET, HEAD.。知道为什么吗?
  • 在路线中更新了我的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
相关资源
最近更新 更多