如何在Laravel Excel中将数组值从单列转换为多列?
问题描述
我在使用Laravel-Excel生成报表时,希望将截图中标记的$item_name列对应的数组值分别展示在不同列,而非合并成单列。我已经尝试过foreach循环、implode和array_map方法,但没能实现预期效果,相关代码如下:
if($customer_type == 2) { $excel_data_attribute = array( array('Distributor Customer') ); if ($show_type == 0) { $excel_data_attribute_array = array( array('Sales Sheet - Quanty Wise') ); }elseif($show_type == 1) { $excel_data_attribute_array = array( array('Sales Sheet - Price Wise') ); }else { $excel_data_attribute_array = array( array('Sales Sheet - Cartoon Quanty Wise') ); } $excel_dynamic_data_array = array(); $index=0; foreach ($productGroup as $gKey => $group ) { $col_[$gKey] = false; foreach($all_product as $pkey => $product) { if($productGroup[$gKey]["id"] == $product->product_group_id) { $col_[$gKey] = true; } } if($col_[$gKey]) { $product_Names_with_keys = $productGroup[$gKey]["t_product"].$productGroup[$gKey]['gorupName']; $excel_dynamic_data_array[$index][] = $productGroup[$gKey]['gorupName']; $index++; } } $item = $excel_dynamic_data_array; $item_name = implode(', ', array_map(function ($entry) { return ($entry[key($entry)]); }, $item)); if($summery == 1) { $excel_data_attribute_array_column = array( array('SL','Region & Rsm',$item_name,'Total') ); }else { if ($customer_type == 2) { $excel_data_attribute_array_column = array( array('SL','Order No','Order Date','Challan No','Challan Date','Bill No','Party Name','Area',$item_name,'Total') ); }else { $excel_data_attribute_array_column = array( array('SL','Order No','Order Date','Bill No','Party Name','Area',$item_name,'Total') ); } } $total_final_array = array_merge($excel_data_attribute,$excel_data_attribute_array,$excel_data_attribute_array_column); } return collect($total_final_array);
解决方案
问题核心是你用implode(', ', ...)把所有分组名称合并成了单个字符串,导致最终只能显示为单列。需要直接将分组名称数组拆解为独立元素,插入到表头数组的对应位置。
修改后的代码如下:
if($customer_type == 2) { $excel_data_attribute = [['Distributor Customer']]; // 用match简化多分支判断 $excel_data_attribute_array = match($show_type) { 0 => [['Sales Sheet - Quanty Wise']], 1 => [['Sales Sheet - Price Wise']], default => [['Sales Sheet - Cartoon Quanty Wise']] }; $groupNames = []; foreach ($productGroup as $group ) { // 简化分组是否有对应产品的判断逻辑 $hasProduct = collect($all_product)->contains(function($product) use ($group) { return $product->product_group_id == $group["id"]; }); if($hasProduct) { // 注意:原代码中gorupName疑似拼写错误,建议检查是否为groupName $groupNames[] = $group['gorupName']; } } if($summery == 1) { // 将分组名称数组拆分为独立列,合并到表头中 $excel_data_attribute_array_column = [ array_merge(['SL','Region & Rsm'], $groupNames, ['Total']) ]; }else { if ($customer_type == 2) { $excel_data_attribute_array_column = [ array_merge(['SL','Order No','Order Date','Challan No','Challan Date','Bill No','Party Name','Area'], $groupNames, ['Total']) ]; }else { $excel_data_attribute_array_column = [ array_merge(['SL','Order No','Order Date','Bill No','Party Name','Area'], $groupNames, ['Total']) ]; } } $total_final_array = array_merge($excel_data_attribute,$excel_data_attribute_array,$excel_data_attribute_array_column); } return collect($total_final_array);
关键修改说明
- 去掉了冗余的
$excel_dynamic_data_array和复杂的array_map处理,直接收集符合条件的分组名称到一维数组$groupNames - 使用
array_merge将$groupNames的每个元素作为独立列插入表头数组,实现每个分组名称单独占一列的效果 - 用
collect($all_product)->contains()简化了原有的嵌套foreach判断,代码更简洁易读 - 提示:原代码中
gorupName可能是拼写错误,请根据实际数据库字段名调整为groupName
内容的提问来源于stack exchange,提问作者Anika Tabassum
相关产品推荐
相关产品推荐

