PHPExcel存在多维数组和创建分组数据的问题

时间:2019-01-18 01:06:16

标签: php excel laravel phpexcel laravel-excel

我当前正在循环的数组将转储此结构

0 => array:11 [▼
  "category_code" => "123"
  "category_name" => "Testing"
  "category_description" => "This is a test category"
  19738 => array:5 [▼
    "identifier" => "720368842943"
    "description" => Test Description One
    "count" => 4
    "details" => array:2 [▼
      0 => array:3 [▼
        "detail_code" => "2751"
        "detail_code2" => "43"
        "detail_specifier" => "Detail One"
      ]
      1 => array:3 [▼
        "detail_code" => "2681"
        "detail_code2" => "9"
        "detail_specifier" => "Detail Two"
      ]
    ]
    "prices" => array:1 [▼
      "01" => "1129.00"
    ]
  ]
  19739 => array:5 [▼
    "identifier" => "720368844121"
    "description" => "Test Description Two"
    "count" => 4
    "details" => array:2 [▼
      0 => array:3 [▼
        "detail_code" => "2751"
        "detail_code2" => "43"
        "detail_specifier" => "Detail One"
      ]
      1 => array:3 [▼
        "detail_code" => "2681"
        "detail_code2" => "9"
        "detail_specifier" => "Detail Two"
      ]
    ]
    "prices" => array:1 [▼
      "01" => "1490.00"
    ]
  ]

但是当我导出到excel时,它仅显示三个顶级属性

123  |  Testing  |  This is a test category

我正在尝试以某种方式导出此文件,以使前3个值排成一行(如标题),并在其下列出所有相关产品,如下所示:

123  |  Testing  |  This is a test category
====================================================================================================================
19738  |  720368842943  |  Test Description One  |  4  |  2751  |  43  |  Detail One  |  2681  |  9  |  Detail Two  |  1129.00
19739  |  720368844121  |  Test Description Two  |  4  |  2751  |  43  |  Detail One  |  2681  |  9  |  Detail Two  |  1490.00

我正在使用maatwebsite的Laravel Excel,它只是laravel中PHPExcel的包装器,但我要做的只是将类别信息作为一行,并将后续产品信息作为其下一行。

这是我正在使用的数组的excel代码,该代码已转储到上面(项目代码是19738,19739的值)

$allCategoryResult= array();

foreach($prices->categories as $category){ 
    $categoryItem = array(); 
    $categoryItem["category_code"] = $category->category_code;
    $categoryItem["category_name"] = $category->category_name; 
    $categoryItem["category_desc"] = $category->category_desc;

    foreach($category->skus as $sku){
        $skuItem = array(); 

        $skuItem["identifier"] = $sku->sku_info->identifier;
        $skuItem["description"] = $sku->sku_info->item->description;
        $skuItem["count"] = $sku->sku_info->item->item_type->count;

        $skuItem["details"] = array(); 
        foreach ($sku->sku_info->details as $details) {
            $detailsItem = array(); 
            $detailsItem["detail_code"] = $details->detail_code;
            $detailsItem["detail_code2"] = $details->detail_code2;
            $detailsItem["detail_specifier"] = $details->detail_specifier;
            $skuItem["details"][] = $detailsItem; 
        }

        $skuItem["prices"] = get_object_vars($sku->prices);


        $itemCode = $sku->sku_info->item->item_code;
        $categoryItem[$itemCode] = $skuItem; 
    }
    $allCategoryResult[] = $categoryItem; 
}


$name = 'Test Export';

$build = Excel::create($name, function ($excel) use ($allCategoryResult) {

    $excel->setTitle('Test Export');

    $excel->sheet('Test Export', function ($sheet) use ($allCategoryResult) {

        $sheet->fromArray($allCategoryResult);
})->download('xlsx');

1 个答案:

答案 0 :(得分:1)

方法fromArray()需要2D数组

$data=(
  array(2) (
    [0] => array(3) (
      [0] => 19738  
      [1] => ...
      [2] => ...
    )
    [1] => array(4) (
      [0] => 19739
      [1] => ...
      [2] => ...
      [3] => ...

数组$ data的每个元素都是一行。每个子元素都是一列的值。重组数组的创建以适合此结构,您就可以开展业务。

此代码未经测试,仅尝试举一个例子。我不确定您对get_object_vars($sku->prices);的处理方式。我敢肯定,这将不得不改变。

$excelRows = [];

foreach($prices->categories as $category){ 

    $excelRows[] = [
      $category->category_code,
      $category->category_name,
      $category->category_desc
    ]

    foreach($category->skus as $sku){

        $row = [
          $sku->sku_info->identifier,
          $sku->sku_info->item->description,
          $sku->sku_info->item->item_type->count
        ]

        foreach ($sku->sku_info->details as $details) {
          $row[] = $details->detail_code;
          $row[] = $details->detail_code2;
          $row[] = $details->detail_specifier; 
        }

        $row[] = get_object_vars($sku->prices);

        $row[] = $sku->sku_info->item->item_code;

        $excelRows[] = $row;
    }
}