您好我正在使用Laravel 5和Laravel Excel http://www.maatwebsite.nl/laravel-excel/docs。
我正在使用将导出到excel的报告模块。我有三张桌子。
Forms, FormsResponses and Metrics
Forms
->id
->phone_number
->calldatetime
FormsReponses
->id
->Forms_id
->Metrics_id
->Response
Metrics
->id
->description
因此,您可以看到我有一个包含指标列表的表单,然后用户将为每个指标选择响应。可以是“是”,“否”,“不适用”。我有这份报告。我们现在说我有3个度量标准,如果添加新的度量标准,可以增加。
Metrics ID|Metrics Description|Phone1|Phone2|Phone3 ...
__________|___________________|______|______|______|___
1 |Sample1 |Yes |Yes |Yes
__________|___________________|______|______|__________
2 |Sample2 |Yes |No |No
__________|___________________|______|______|__________
3 |Sample3 |Yes |No |No
所以我正在做的是显示每个指标上每个电话号码的回复。我有一个From Date和To Date。此报告将在我已有的excel文件中输出。因此,此报告会垂直扩展(取决于指标的数量)以及水平扩展,具体取决于我将在日期范围中获得的电话号码的数量。我可以正确地使用它。但它太慢了。如果时间处理需要花费很多时间,我发现在我的代码中搜索响应是有原因的。我的代码:
$query = "SELECT id, phone FROM qcv.forms WHERE calldatetime >= '$from' AND calldatetime <= '$to' ORDER BY id ASC ;";
$phone = DB::connection('mysql')->select($query);
$metrics = Metric::all();
$metric_start = 10;
$start = "D";
$count = 10;
foreach ($phone as $key => $value2) // Populate Phone Numbers Horizontally
{
$sheet->cell($start.'9', $value2->phone);
// This will fill the responses for each number
foreach ($metrics as $key => $value)
{
$responses = FormResponses::where('form_id', '=', $value2->id)->where('metrics_id', '=', $value->id)->get();
$sheet->cell($start.$count, $responses[0]->response);
// Populate Metrics Vertically
$sheet->cell('C'.$count, $value->question);
$sheet->cell('B'.$count, $value->description);
$sheet->cell('A'.$count, $value->metrics_name);
$count++;
}
$start++;
$count = 10;
}
和
$responses = FormResponses::where('form_id', '=', $value2->id)->where('metrics_id', '=', $value->id)->get();
该行占用时间,因为对于每个电话号码,它必须搜索我所拥有的每个指标的响应。想象一下,如果我有30个指标和150个电话号码。需要花时间。有更好的方法吗?
答案 0 :(得分:0)
使用fromArray
method这不是一个更好的方法,它似乎更有效,而不是创建自己跟踪它。我在为我们公司创建的导出脚本中使用了相同的策略。
创建您想要的数组,例如:
$forms = [
['id', 'phone_number', 'calldatetime'], // headers
// total of 5 dataset items
];
$formsReponsesStartAtRow = $formsStartAtRow + count($forms) + ;
$formsReponses = [
['id', 'Forms_id', 'Metrics_id', 'Response'], // headers
// total of 15 dataset items
];
$metrics = [
['id', 'description']
// total of 100 dataset items
];
当您的数据准备就绪时,计算每个数组的起始行。
// leave between each dataset 2 rows
$rowSpacing = 2;
$startCol = 'A';
// start cell A1
$startAtRow = 1;
$forms = [...];
// add $forms to the sheet
$sheet->fromArray($forms, null, $startCol . $startAtRow);
// calculate start row from previous $startAtRow
// start cell is: 5 + 2 = 7 = A7
$startAtRow = $startAtRow + count($forms) + $rowSpacing;
$formsReponses = [...];
// add $formsReponses to the sheet
$sheet->fromArray($formsReponses, null, $startCol . $startAtRow);
// calculate start row from previous $startAtRow
// start cell is: 7 + 15 + 2 = 24 = A24
$startAtRow = $startAtRow + count($formsReponses) + $rowSpacing;
$metrics = [...];
// add $metrics to the sheet
$sheet->fromArray($metrics, null, $startCol . $startAtRow);
如果您添加另一个将开始的数据集:24 + 100 + 2 = 126 = A126
每当您的数据集增长时,您的Excel都会预测更改。
希望这会对你有所帮助。