【问题标题】:How can you include column headers when exporting Eloquent to Excel in Laravel?在 Laravel 中将 Eloquent 导出到 Excel 时如何包含列标题?
【发布时间】:2019-01-17 23:11:22
【问题描述】:

我试图让用户下载 Excel,使用带有产品信息的 Laravel 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

但是,这应该包含列标题,如 ID、成本等...如何在此输出中包含列标题?

【问题讨论】:

    标签: php excel laravel laravel-excel


    【解决方案1】:

    根据documentation你可以改变你的类使用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"];
        }
    }
    

    这适用于所有导出类型(FromQueryFromCollection 等)

    【讨论】:

    • 谢谢!有没有办法可以使用 Eloquent 动态获取数据库中的列?我会尽快接受!
    • 如果要导出表的所有列:stackoverflow.com/a/37157879/1255289
    • 我必须如何调用控制器中的标题方法?
    • @miken32 有没有办法将数组从query 函数传递给标题,或者至少在那里更新它并使其在标题上可用。实际上,只有当该列上有数据时,我才需要添加标题。那么,有什么解决方法吗?
    • 这是一个函数。你可以用它做任何你想做的事情@SarojShrestha。查看类的代码,很可能数据是您可以访问的属性。
    【解决方案2】:
    <?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 对我来说,可能是因为版本较新。
    【解决方案3】:
    <?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"];
        }
    }
    

    【讨论】:

      【解决方案4】:
      <?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'
                  ];
              }
          }
      

      【讨论】:

      • 虽然这段代码可能会解决问题,包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。
      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案5】:

      您可以将其与 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 $this->collection()->first()->keys()->toArray();
          }
      }
      

      【讨论】:

        【解决方案6】:

        此代码适用于我

        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']);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-12
          • 2020-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多