【发布时间】:2021-07-07 12:32:11
【问题描述】:
在我的项目中,我使用 Maatwebsite/Excel 功能将排序的集合导出到 Excel。目前运行良好。
结果是通过不同任务在汽车上工作的汽车集合。一辆车可以有 1+ 个任务/次。
<?php
namespace App\Exports;
use App\Time;
use Carbon\Carbon;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
class Times2Export implements FromCollection, WithMapping, WithHeadings, ShouldAutoSize, WithColumnFormatting
{
public function collection()
{
return Time::all()->sortBy("car_id");
}
public function headings(): array
{
return [
'Dossiernummer',
'Auto',
'Taak',
'Werknemer',
'Starttijd',
'Stoptijd',
'Duur',
];
}
/**
* @var Time $time
*/
public function map($time): array
{
$dt = Carbon::parse($time->stop)->diffInSeconds(Carbon::parse($time->start));
$duur = (is_null($time->stop)) ? 0 : $dt;
return [
$time->car->dossiernr,
$time->car->brand . " " . $time->car->type . " (" . $time->car->license . ")",
$time->task->name,
$time->employee->name,
$time->start,
$time->stop,
'=' . $duur . '/86400',
];
return $time;
}
public function columnFormats(): array
{
return [
'G' => NumberFormat::FORMAT_DATE_TIME4,
];
}
}
我的愿望是,在每辆车之后,我希望有一个空行,其中包含在汽车上工作的 COUNT 时间,因此计算每辆车 G 列中的时间(基于每辆车的 x 行,其中 x 不是提前知道)。
我已经测试了很多,但我可能误解了地图功能(我还是初学者)。
有人告诉我应该使用 GroupBy 遍历集合 - 对吗?我想就像this site 中描述的那样。
我不知道从哪里开始创建我的收藏。接下来我可以尝试什么?
更新
非常感谢您的努力,尤其是优化。
让我尝试展示我想要实现的目标。
目前我的输出是这样的(出于用户数据的原因,我已经模糊了一些项目):
这就是我想要的方式:
更新 15/04
【问题讨论】:
标签: excel laravel dictionary collections