【问题标题】:Laravel Excel , exporting from a model, styling issuesLaravel Excel,从模型导出,样式问题
【发布时间】:2014-09-23 14:59:33
【问题描述】:

我正在尝试使用“Laravel excel”将一些数据从我的模型导出到 excel 表格中,我已经做到了,但我的结果与我真正需要的结果相去甚远

这就是我在下载文件中得到的:

这就是我真正想要完成的:

我的控制器部分:

//casting export...
        Excel::create('ExcelExport', function($excel) use($filters, $agents) {

            $main_arr = array();

            foreach($agents as $value){                 
                $main_arr[] = Card::cardForUser($value, $filters)->toArray();                   
            }

            $excel->sheet('Sheetshit', function($sheet) use($main_arr) {
                //You may ask me "why are you using foreach?"
                // and my answer will be:"I don`t KNOW, because it WORKS!"

                foreach($main_arr as $one){
                    $sheet->fromArray($one);
                }

            });

        })->export('xls');

模型部分:

public static  function  cardForUser($user_id, $filters = array()){
        $query = static::UserId($user_id);//just gets 'where user id'

        foreach($filters['fields'] as $select){
            $query->addSelect($select);
        }
            return $query->get();
    }    

    public function scopeUserId($query, $user_id) {
        return $query->where('user_id', '=', $user_id);

    }

$filters 数组由数据库中的字段名称组成,因此它基本上决定了哪些列包含在导出中。这意味着我的$main_arr 可能具有从 1 到 5 的内部字段长度。每个代理在 DB 中可以有很多行或根本没有行

设置了 4 个过滤器的 $main_arr 转储示例:

 array (size=8)
  0 => 
    array (size=10)

//thats will be first agent
          0 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Chrysler' (length=8)
              'ts_model' => string 'PT CRUISER' (length=10)
          1 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Opel' (length=4)
              'ts_model' => string 'Corsa' (length=5)
          2 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Dodge' (length=5)
              'ts_model' => string 'Stratus' (length=7)
          3 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Р’РђР—' (length=6)
              'ts_model' => string '2112' (length=4)
          4 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Mercedes-Benz' (length=13)
              'ts_model' => string 'E 270' (length=5)
          5 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Р’РђР—' (length=6)
              'ts_model' => string '21140 LADA SAMARA' (length=17)
          6 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'LADA' (length=4)
              'ts_model' => string '213100 LADA 4С…4' (length=16)
          7 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Р’РђР—' (length=6)
              'ts_model' => string '21110' (length=5)
          8 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Chevrolet' (length=9)
              'ts_model' => string 'Lanos' (length=5)
          9 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'VOLKSWAGEN' (length=10)
              'ts_model' => string 'PASSAT' (length=6)
//thats will be second agent
      1 => 
        array (size=10)
          0 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Mercedes' (length=8)
              'ts_model' => string 'Benz' (length=4)
          1 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Chevrolet' (length=9)
              'ts_model' => string 'Corvette' (length=8)
          2 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Chevrolet' (length=9)
              'ts_model' => string 'Corvette' (length=8)
          3 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Chevrolet' (length=9)
              'ts_model' => string 'Corvette' (length=8)
          4 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Chevrolet' (length=9)
              'ts_model' => string 'Corvette' (length=8)
          5 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Chevrolet' (length=9)
              'ts_model' => string 'Corvette' (length=8)
          6 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Mazeratti' (length=9)
              'ts_model' => string 'M4' (length=2)
          7 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Ferrari' (length=7)
              'ts_model' => string 'F4' (length=2)
          8 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Mazda' (length=5)
              'ts_model' => string '5' (length=1)
          9 => 
            array (size=4)
              'date_start' => string '06.08.2014 10:00:00' (length=19)
              'ts_category' => int 2
              'ts_make' => string 'Test' (length=4)
              'ts_model' => string 'Test' (length=4)
        etc...

Sooo...我的问题是

  1. 如何设置主标题(例如 img 中的“标题内容”)?
  2. 为什么我的列标题(date_start, ts_category,ts_make,ts_model) 在第一个数组元素中消失了? (您可以在第一个 img 中看到我没有第一个子数组的“日期开始”和“ts_category”标题。顺便说一句,有时我根本没有第一个子数组的标题!)
  3. 我可以将子数组的标题加粗(ts_make 等)吗?怎么样?
  4. 如何为每个代理制作字幕(我打算使用子数组键显示多个代理)?

更新发布工作代码作为答案。

【问题讨论】:

    标签: php excel laravel model laravel-excel


    【解决方案1】:

    我不会回答您的所有问题,因为您需要自己查看文档。不过我会告诉你如何得到这样的效果:

    我认为这比解释你做错了什么更能帮助你

    上述excel文件的代码如下:

    Excel::create('ExcelExport', function ($excel) {
    
        $excel->sheet('Sheetname', function ($sheet) {
    
            // first row styling and writing content
            $sheet->mergeCells('A1:W1');
            $sheet->row(1, function ($row) {
                $row->setFontFamily('Comic Sans MS');
                $row->setFontSize(30);
            });
    
            $sheet->row(1, array('Some big header here'));
    
            // second row styling and writing content
            $sheet->row(2, function ($row) {
    
                // call cell manipulation methods
                $row->setFontFamily('Comic Sans MS');
                $row->setFontSize(15);
                $row->setFontWeight('bold');
    
            });
    
            $sheet->row(2, array('Something else here'));
    
            // getting data to display - in my case only one record
            $users = User::get()->toArray();
    
            // setting column names for data - you can of course set it manually
            $sheet->appendRow(array_keys($users[0])); // column names
    
            // getting last row number (the one we already filled and setting it to bold
            $sheet->row($sheet->getHighestRow(), function ($row) {
                $row->setFontWeight('bold');
            });
    
            // putting users data as next rows
            foreach ($users as $user) {
                $sheet->appendRow($user);
            }
        });
    
    })->export('xls');
    

    【讨论】:

    • 这帮助很大,谢谢。希望“Maatwebsite”将这样的内容作为示例提供给他的指南。
    【解决方案2】:

    1. 如何设置主标题(例如 img 中的“标题内容”)?

      看文档,很简单:

      $sheet->prependRow(1, array(
          'Example header'
          ))->cell('A1', function($cell) {
              $cell->setFontWeight('bold');
              $cell->setFontSize(18);
      });
      
    2. 我可以将子数组的标题加粗(ts_make 等)吗?怎么样?

      计算哪些行必须加粗:

      $count = 2;
      foreach($main_arr as $one){
          $sheet->fromArray($one, null, 'A2');
      
          $sheet->row($count, function($row) {
              $row->setFontWeight('bold');
          });
          $count += count( $one ) + 1;
      }
      
    3. 如何为每个agent做字幕(我打算用sub-arraykey来显示多个agent)?

      和上面的方法类似:)

    【讨论】:

    • 感谢您的帮助,在我的代码中使用了计数的想法!不幸的是,您的回答无法完全解决我的问题,但我投了赞成票:)
    • 嘿,我如何使用 Laravel-Excel Mattwebsite 读取那种类型的 Excel 文件?
    • @RenishKhunt 你说的“阅读”到底是什么意思?您可以使用任何类似 Excel 的软件(OpenOffice、LibreOffice 等)打开它。如果您的意思是使用代码“读取”,您可以使用包的函数 Excel::load('file.xls', function($reader) { // reader methods }); 或任何其他 php 文件函数。你可以在这里阅读更多内容maatwebsite.nl/laravel-excel/docs/import
    【解决方案3】:

    Marcinr4xz 的帮助下,我得到了这个工作代码:

    Excel::create('Filename', function($excel) use($filters, $agents) {
    
                $excel->sheet('sheetname', function($sheet) use( $agents, $filters) {
                    // first row with header title
                    $sheet->mergeCells('A1:E1');//merge for title
                    $sheet->row(1, function ($row) {
                        $row->setFontSize(18);
                    });
                    $sheet->row(1, array('Header Stuff') );//add title
    
                    $sub_titles = array(/*content*/);//array for agents names                   
    
                    $count = 2;//pointer for rows with agents name
                    foreach($agents as $agent_id){
                        //get agent name.
                        $agent_name = Model::AgentById(Auth::user(), $agent_id);
    
                        $sheet->appendRow(array($agent_name));//add agent name
                        $sheet->mergeCells('A'.$count.':'.'E'.$count);//merge for agent name
                        $sheet->row($sheet->getHighestRow(), function ($row) {//get last row at the moment and style it
                            //$row->setFontWeight('bold');
                            $row->setFontSize(14);
                        });
    
                        $cards = CardModel::cardForUser($agent_id, $filters)->toArray();//get cards for agent
                        //if there is cards show them, else show nothing message
                        if(count($cards) > 0){
                            $sheet->appendRow($sub_titles);//add sub-titles of agents fields
                            $sheet->row($sheet->getHighestRow(), function ($row) {
                                $row->setFontWeight('bold');
                            });
                            foreach($cards as $card){//add all agent fields
                                $sheet->appendRow($card);
                            }
                            $count += count($cards) + 2;
                        }
                        else{
                            $sheet->appendRow(array('nothing to show')));//add nothing to show message
                            $sheet->row($sheet->getHighestRow(), function ($row) {
                                $row->setFontWeight('bold');
                            });
                            $count += 2;
                        }
                    }
                });
    
            })->export('xls');
    

    【讨论】:

      【解决方案4】:

      我建议你用你想要的样式创建一个excel文件,然后将你的数据附加到这个模板文件中,按照这个例子:

          public function export_xls($expense_id, $file_format_id){
      
          $expense      = Expense::find($expense_id);
          $file_format  = FileFormat::find($file_format_id);
      
          $routes = DB::table('buy_orders')
              ->join('expenses','expenses.id','=','buy_orders.expense_id')
              ->join('users','expenses.user_id','=','users.id')
              ->select(
                  'buy_orders.code',
                  'buy_orders.cost_center',
                  'buy_orders.book_account',
                  'buy_orders.active',
                  'buy_orders.expenditure',
                  'buy_orders.inventory',
                  'buy_orders.quantity',
                  'buy_orders.price_unit',
                  'buy_orders.description',
                  'buy_orders.estimated_value',
                  'buy_orders.destination',
                  'buy_orders.delivery_date'
              )
              ->where('buy_orders.expense_id','=',$expense_id)
              ->orderBy('buy_orders.created_at','desc')
              ->get();
      
          $data = json_decode(json_encode((array) $routes), true);
      
          Excel::load('/storage/app/template.xls', function($file) use($expense, $data){
      
              $file->setActiveSheetIndex(0)->setCellValue('D8', $expense->user->name);
              $file->setActiveSheetIndex(0)->setCellValue('L8', $expense->application_date);
              $file->setActiveSheetIndex(0)->setCellValue('P8', $expense->code);
              $file->setActiveSheetIndex(0)->setCellValue('D45', $expense->description);
      
              $row = 13;
              foreach($data as $key => $temp) {
                  $col = 1;
                  foreach(array_keys($temp) as $value) {
                      $file->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $temp[$value]);
                      $col++;
                  }
                  $row++;
              }
          })->export('xls');
      }
      

      想法是制作和数组,然后使用方法 setCellValueByColumnAndRow 附加

      【讨论】:

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