Laravel自定义CSV导出

时间:2018-03-26 09:17:14

标签: php laravel csv laravel-excel

我想知道是否可以在导出CSV文件之前编辑列?

例如,我的产品表中包含title description created_at updated_at我想要的是导出title body之类的内容您在此处看到我删除了created_atupdated_at并将description列重命名为body是否可能?

  

我正在使用this package版本2.1.0 Info Graph

enter image description here

其他信息

目前我使用样本中的默认导出代码,包括没有其他查询等。尝试计算如何更改代码以便按我的意愿导出数据。

public function export() {
      $products = Product::all();
        Excel::create('products', function($excel) use($products) {
               $excel->sheet('sheet 1', function($sheet) use($products){
                $sheet->fromArray($products);
               });
        })->export('xls');

PS:我尝试创建的正是this extension在Magento中的作用,

sss

正如您在此扩展程序中看到的那样,我们可以在导出数据之前change default database column namesadd/remove columns等(但我只需要这两个选项)。

更新

我设法让我的表列名称如下:

Product model

public function getTableColumns() {
    return $this->getConnection()->getSchemaBuilder()->getColumnListing($this->getTable());
}

和我的controller就像:

public function export(Request $request) {
      $product = new Product;
      $list = $product->getTableColumns();
      dd($list);
      //$products = Product::select($list)->get();


      // Excel::create('products', function($excel) use($products) {
        // $excel->sheet('sheet 1', function($sheet) use($products){
           // $sheet->fromArray($products);
        // });
      // })->export('xls');
}

my list dd

array:27 [▼
  0 => "id"
  1 => "title"
  2 => "slug"
  3 => "imageOne"
  4 => "imageTwo"
  5 => "short_description"
  6 => "description"
  7 => "price"
  8 => "meta_description"
  9 => "meta_tags"
  10 => "arrivalDays"
  11 => "height"
  12 => "weight"
  13 => "lenght"
  14 => "width"
  15 => "sku"
  16 => "stock"
  17 => "label"
  18 => "label_from"
  19 => "label_to"
  20 => "label_color"
  21 => "status_id"
  22 => "brand_id"
  23 => "category_id"
  24 => "subcategory_id"
  25 => "created_at"
  26 => "updated_at"
]

问题

  1. 如何编辑此列名称before export my file
  2. 如何获取每列的复选框? (以下说明)
  3. 复选框

      

    我需要为每列添加复选框以说明此列包含导出   文件与否。

         

    example我将取消选中created_at列,以便它不会   包含我导出的CSV文件。

    更新2

    好的,我可以使用我的自定义名称。有一个很小的问题:

    我的数据行将在excel文件中重复两次。

    Explain

    我修改了数据库的5列,得到了10

    sdd

    这是我更新的代码:

    public function export(Request $request) {
          $products = Product::all();
          Excel::create('products', function($excel) use($products, $request) {
            $excel->sheet('sheet 1', function($sheet) use($products, $request){
    
              $ddd = $request->except('_token');
              foreach($ddd as $fff){
                $ddd[] = $fff;
              }
    
                $sheet->fromArray($products, null, 'A1', false, false);
                $sheet->row(1, $ddd);
            });
          })->export('csv');
          return redirect()->back();
    }
    

    任何想法?

1 个答案:

答案 0 :(得分:1)

在创建Excel工作表之前,您不能转换数据吗?例如:

$products = Product::select(
    'subject as title', 
    'body as description'
)->get();

编辑:

根据您提供的更新,它是这样的:

public function export(Request $request)
{
     $list = [];
     foreach($request->columns as $column){
         $list[] = $column->DatabaseHeadingName . ' as ' . $column->CustomHeadingName;
     }

    $products = Product::select($list)->get();

    Excel::create('products', function($excel) use($products) {
        $excel->sheet('sheet 1', function($sheet) use($products){
            $sheet->fromArray($products);
        });
    })->export('xls');
}