Laravel Excel,从模型导出样式问题

我试图从我的模型中导出一些数据到“Laravel excel”的excel示例,我已经完成了,但是我的结果远离我真正需要的

这是我在下载的文件中得到的: 实际的laravel 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个filter的$ 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看到,我没有第一个子数组的“date start”和“ts_category”头文件,有时候我根本没有第一个子数组的头文件!
  3. 我可以使我的子arrays的标题粗体(ts_make,等)? 怎么样?
  4. 我怎样才能让每个代理的子标题(我打算使用子数组键来显示一些代理)?

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

我不会回答你所有的问题,因为你需要自己查看文档。 不过,我会告诉你如何得到这样的效果: 在这里输入图像说明

而且我认为这不仅能帮助你解释你做错了什么

上面的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'); 

在这里输入图像说明

  1. 我如何设置主标题(例如img中的“标题东西”)?

    看文档,这很简单:

     $sheet->prependRow(1, array( 'Example header' ))->cell('A1', function($cell) { $cell->setFontWeight('bold'); $cell->setFontSize(18); }); 
  2. 我可以使我的子arrays的标题粗体(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. 我怎样才能为每个代理(我打算使用子数组键显示一些代理)的子标题?

    以与上述类似的方式:)

在Marcin和r4xz的帮助下,我来到这个工作代码:

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

我build议你用你想要的风格创build一个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'); } 

这个想法是make和array,然后使用方法setCellValueByColumnAndRow进行连接