Laravel Excel, экспорт из модели, проблемы со стилем

Я пытаюсь экспортировать некоторые данные из моей модели в схему Excel с помощью «Laravel 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. У каждого агента может быть много строк в БД или вообще нет

Пример дампа $ main_arr с 4 установленными фильтрами:

 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...

Ооочень … мои вопросы:

  1. Как мне установить основной заголовок («Заголовок» в примере img)?
  2. почему мои заголовки столбцов (date_start, ts_category, ts_make, ts_model) исчезают в первом элементе массива? (Вы можете видеть на первом img, что у меня нет заголовков «date start» и «ts_category» для первого подмассива. Кстати, иногда у меня вообще нет заголовков для первого подмассива!)
  3. Могу ли я сделать заголовки моего подмассива жирным шрифтом (ts_make и т. Д.)? Как?
  4. Как сделать подзаголовки для каждого агента (я планирую использовать ключ подмассива для отображения количества агентов)?

ОБНОВИТЬ Выложил рабочий код в качестве ответа.

7

Решение

Я не буду отвечать на все ваши вопросы, потому что вам придется самостоятельно просматривать документацию. Однако я покажу вам, как получить такой эффект:введите описание изображения здесь

и я думаю, что это поможет вам больше, чем объяснение того, что вы сделали не так

Код для файла 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');
20

Другие решения

введите описание изображения здесь

  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. Как я могу сделать подзаголовки для каждого агента (я планирую использовать sub-arraykey для отображения количества агентов)?

    Таким же образом, как указано выше 🙂

2

С помощью 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');
0

Я рекомендую вам создать файл 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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector