Laravel excel没有以正确的格式导出

Posted

技术标签:

【中文标题】Laravel excel没有以正确的格式导出【英文标题】:Laravel excel not exporting in correct format 【发布时间】:2019-06-12 03:21:05 【问题描述】:

我目前有一个我构建的数组,可以像这样转储:

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"
    ]
  ]

我正在使用 laravel excel 将其导出为 excel 文件,但它并没有按照我的意图工作

当它导出到 excel 时,我只得到***信息:

123  |  Testing  |  This is a test category

但我想将该信息作为标题获取,然后将该类别的每个后续产品作为一行获取,因此对于上面的示例,它看起来像:

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

这是我正在使用的数组的 excel 代码,它在上面转储:

$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);

【问题讨论】:

Tom - 你发布的所有内容对我来说都是正确的代码。我认为问题可能在于您如何指示 LaravelExcel 将信息吐出到电子表格中,但您还没有发布那段代码。如果你坚持下去,也许有人可以帮助你。 也许这就是我的困惑所在。除了我下载为 excel 格式的行之外,我上面所拥有的一切。但我正在使用函数 fromArray 来转储它。即使使用该功能,我还应该构建特定的表单吗? 射击,我明白了。我只是看着那个包裹并同意。看起来这个包是超高级的(一条线就可以了!)。我已经使用 phpExcel 多年了,尽管它很痛苦,但它完全可以控制。我假设在 LaravelExcel 中有一些方法可以变得更细化并告诉它数组的 N 级别是你需要显示的......但它看起来不像是为那种开箱即用的复杂性而设置的.抱歉,我帮不上忙。 谢谢,我可能也要看看php excel 请发布您使用的库的确切版本。对我来说,它看起来像laravel excel 2.1,对吗?您是否关闭了自动标题生成?如果不将最后一行更改为$sheet->fromArray($allCategoryResult, null, 'A1', false, false);,否则它将尝试根据数组键设置标题,因此不会添加除相应索引之外的任何数据。不确定最后一部分,但无论如何都会有助于调试 【参考方案1】:

我猜(这只是一个猜测)标题生成在这里失败了。 尝试操作您的数据以使每一列都有相同的索引(注意:代码未测试,您可能需要更正它):

$allCategoryResult= array();

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

    array_push($allCategoryResult, $categoryItem);    

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

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

        /* We leave that one out for the start
        $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["column4"] = get_object_vars($sku->prices);

        array_push($allCategoryResult, $skuItem);    
    

这应该会给你一个包含类似数据的数组:

Array(
  Array(
    ['column1'] = ...
    ['column2'] = ...
    ... 
  ),
  Array(
    ['column1'] = ...
    ['column2'] = ...
    ... 
  )
)

如果这对您的 Excel 有任何改变,请通知我。这将是对图书馆的基本了解,这将有助于我们为您提供帮助。

要回答您的评论,可以在您的 sheetexcel 对象上调用本机 phpExcel 函数。所以你可以用它来格式化一行粗体:

$sheet->->getStyle('A1:'.$sheet->getHighestColumn().'1')->getFont()->setBold(true);

请阅读phpExcel以了解laravel excel的真正作用,它将对您有很大帮助

【讨论】:

我相信这确实有效,但我现在会尝试提取其他数据并查看。你知道是否有一种方法可以计算,以便我可以使用 laravel excel 将任何以 category_code 开头的行设置为粗体? 查看我的答案的新部分 这似乎并不能解决问题,只是将第一行设置为粗体。我希望将每一行的 category_code、category_name 和 category_description 设置为粗体 当然,这只是一个例子。您将必须跟踪此行的位置。只需添加一个计数器,每array_push 增加一个计数器,然后将计数器值保存在一个数组中,然后将该数组中保存的所有行设置为粗体。 哦,我不确定如何,但我会尝试

以上是关于Laravel excel没有以正确的格式导出的主要内容,如果未能解决你的问题,请参考以下文章

如何更改csv导出的列的格式-Laravel Excel

SSIS 2008,Excel 2007 正确格式化 excel 列(导出,不导入)

jsp导出身份证到excel时候格式不正确

在ssh框架中使用poi正确导出具有比较高级固定格式的excel 整体过程,查询导出前后台下载

Webapi 导出到 excel 下载的损坏文件

将剑道网格导出到excel时格式化为文本的数字