【问题标题】:How to add dynamic sum total [Footer] to an array column in laravel excel version 3.1?如何在 laravel excel 版本 3.1 中将动态总和 [Footer] 添加到数组列?
【发布时间】:2023-01-16 11:08:53
【问题描述】:

我在这里使用这个参考 > https://docs.laravel-excel.com/3.1/exports/collection.html

我使用Maatwebsite 的 3.1 版来映射数据并通过 excel 文件提取数据。

这是我用来导出数据的控制器功能。

public function exportTestData(Request $request)
{
    $timestamp = Carbon::now()->toDateTimeString();
    $filename = "act-data-({$timestamp}).xlsx";

    // getActData >> the function of the sql raw query
    return Excel::download(new TestDataExport($this->getActData($request, true)), $filename);
}

它产生这个输出:

问题:如何添加一个动态数据,垂直汇总SalesIncomeBoth

我想要这样的期望输出:

所以基本上是一个自定义数据,它汇总了摘要并在每个数组结束后动态添加。我的 Total 函数数组分配给单元格 H2 水平汇总数据。在这种集成中如何垂直汇总每个数据。试图找到对 stackoverflow、laracasts 和 github 的任何参考,但我找不到任何好的资源来开始。 有人可以帮我解决这种情况吗?谢谢。

这是我的导出功能的完整代码,以了解编码过程。

测试数据导出.php

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Events\AfterSheet;

class TestDataExport implements FromCollection, ShouldAutoSize, WithCustomStartCell, WithHeadings, WithTitle, WithEvents
{
    use Exportable;

    /**
     * testDatas.
     *
     * @var string
     */
    protected $actData;

    public function __construct($testDatas)
    {
        $this->testDatas = $testDatas;
    }

    public function startCell(): string
    {
        return 'A2';
    }

    public function registerEvents(): array
    {
        return [
            AfterSheet::class => function (AfterSheet $event) {
                /** @var Sheet $sheet */
                $sheet = $event->sheet;

                // map header data to this cells
                $sheet->mergeCells('E1:H1');
                $sheet->setCellValue('E1', "Summaries");

                $styleArray = [
                    'alignment' => [
                        'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
                    ],
                ];

                $cellRange = 'A1:X1'; // All headers center align
                $event->sheet->getDelegate()->getStyle($cellRange)->applyFromArray($styleArray);
            },
        ];
    }

    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        $testDatas = $this->testDatas;

        if (isset($testDatas)) {
            return collect($testDatas)->map(function ($actData, $key) {

                //define totals
                $totals = ! empty($actData['Summaries']) ? $actData['Summaries']['total'] : '0';

                return [
                    'sales' => ! empty($actData['Summaries']) ? $actData['Summaries']['sales'] : '0',
                    'income' => ! empty($actData['Summaries']) ? $actData['Summaries']['income'] : '0',
                    'both' => ! empty($actData['Summaries']) ? $actData['Summaries']['both'] : '0',
                    'total' => ! empty($totals) ? $totals : '0',
                ];
            });
        }

        return collect([]);
    }

    /**
     * Heading of the excel
     *
     * @return array
     */
    public function headings(): array
    {
        return [
            'Sales',
            'Income',
            'Both',
            'Total',
        ];
    }

    /**
     * Title for each sheet
     *
     * @return string
     */
    public function title(): string
    {
        return 'Test Data Export';
    }
}

更新

我在我的registerEvents 函数中使用它。

//calculate totals
    
                $sheet->setCellValue('V'. ($sheet->getHighestRow()+1), '=SUM(V3:V'.$sheet->getHighestRow().')');
                $sheet->setCellValue('W'. ($sheet->getHighestRow()+1), '=SUM(W3:W'.$sheet->getHighestRow().')');
                $sheet->setCellValue('X'. ($sheet->getHighestRow()+1), '=SUM(X3:X'.$sheet->getHighestRow().')');
                $sheet->setCellValue('Y'. ($sheet->getHighestRow()+1), '=SUM(Y3:Y'.$sheet->getHighestRow().')');

它给了我每一行的总价值,但我也遇到了问题。每次我向每一行添加一个新的总计。总数将增加 1。

此处输出:

有没有办法在不增加 1 的情况下修改代码?截至目前,它将从一个单元格跳到另一个单元格

【问题讨论】:

  • 你有没有解决这个问题。文档真的很难分开和解决。
  • 是的@warmwhisky,但使用硬代码。我会发布一个答案

标签: laravel laravel-5.8 maatwebsite-excel laravel-excel


【解决方案1】:

使用styles 函数设法解决了这个问题

public function styles(Worksheet $sheet)
    {
        $styleArray = [
        'font'  => [
            'bold'  => true,
            'color' => ['rgb' => 'FF0000'],
        ]];

        $sheet->setCellValue('D' . ($sheet->getHighestRow()+1), 'TOTALS')->getStyle('D' . ($sheet->getHighestRow()))->applyFromArray($styleArray);

        // Add cell with SUM formula to last row
        $sheet->setCellValue('E' . ($sheet->getHighestRow()+0), '=SUM(E2:E' . ($sheet->getHighestRow()-1) . ')')->getStyle('E' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('F' . ($sheet->getHighestRow()+0), '=SUM(F2:F' . ($sheet->getHighestRow()-1) . ')')->getStyle('F' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('G' . ($sheet->getHighestRow()+0), '=SUM(G2:G' . ($sheet->getHighestRow()-1) . ')')->getStyle('G' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('H' . ($sheet->getHighestRow()+0), '=SUM(H2:H' . ($sheet->getHighestRow()-1) . ')')->getStyle('H' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('I' . ($sheet->getHighestRow()+0), '=SUM(I2:I' . ($sheet->getHighestRow()-1) . ')')->getStyle('I' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('J' . ($sheet->getHighestRow()+0), '=SUM(J2:J' . ($sheet->getHighestRow()-1) . ')')->getStyle('J' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('K' . ($sheet->getHighestRow()+0), '=SUM(K2:K' . ($sheet->getHighestRow()-1) . ')')->getStyle('K' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('L' . ($sheet->getHighestRow()+0), '=SUM(L2:L' . ($sheet->getHighestRow()-1) . ')')->getStyle('L' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('M' . ($sheet->getHighestRow()+0), '=SUM(M2:M' . ($sheet->getHighestRow()-1) . ')')->getStyle('M' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('N' . ($sheet->getHighestRow()+0), '=SUM(N2:N' . ($sheet->getHighestRow()-1) . ')')->getStyle('N' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('O' . ($sheet->getHighestRow()+0), '=SUM(O2:O' . ($sheet->getHighestRow()-1) . ')')->getStyle('O' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('P' . ($sheet->getHighestRow()+0), '=SUM(P2:P' . ($sheet->getHighestRow()-1) . ')')->getStyle('P' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('Q' . ($sheet->getHighestRow()+0), '=SUM(Q2:Q' . ($sheet->getHighestRow()-1) . ')')->getStyle('Q' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('R' . ($sheet->getHighestRow()+0), '=SUM(R2:R' . ($sheet->getHighestRow()-1) . ')')->getStyle('R' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('S' . ($sheet->getHighestRow()+0), '=SUM(S2:S' . ($sheet->getHighestRow()-1) . ')')->getStyle('S' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('T' . ($sheet->getHighestRow()+0), '=SUM(T2:T' . ($sheet->getHighestRow()-1) . ')')->getStyle('T' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('U' . ($sheet->getHighestRow()+0), '=SUM(U2:U' . ($sheet->getHighestRow()-1) . ')')->getStyle('U' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('V' . ($sheet->getHighestRow()+0), '=SUM(V2:V' . ($sheet->getHighestRow()-1) . ')')->getStyle('V' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('W' . ($sheet->getHighestRow()+0), '=SUM(W2:W' . ($sheet->getHighestRow()-1) . ')')->getStyle('W' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('X' . ($sheet->getHighestRow()+0), '=SUM(X2:X' . ($sheet->getHighestRow()-1) . ')')->getStyle('X' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('Y' . ($sheet->getHighestRow()+0), '=SUM(Y2:Y' . ($sheet->getHighestRow()-1) . ')')->getStyle('Y' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('Z' . ($sheet->getHighestRow()+0), '=SUM(Z2:Z' . ($sheet->getHighestRow()-1) . ')')->getStyle('Z' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('AA' . ($sheet->getHighestRow()+0), '=SUM(AA2:AA' . ($sheet->getHighestRow()-1) . ')')->getStyle('AA' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('AB' . ($sheet->getHighestRow()+0), '=SUM(AB2:AB' . ($sheet->getHighestRow()-1) . ')')->getStyle('AB' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
        $sheet->setCellValue('AC' . ($sheet->getHighestRow()+0), '=SUM(AC2:AC' . ($sheet->getHighestRow()-1) . ')')->getStyle('AC' . ($sheet->getHighestRow()))->applyFromArray($styleArray);
    }

在第一个 CellValue 中,它是 D,这个将递增最后一个数据并将其添加到正下方以计算总数。

对于以下 E > AC,当我尝试对每个 setCellValue 使用 $sheet-&gt;getHighestRow()+1) 时,数据在每个单元格列之后递增。我尝试对其进行试验,但似乎当您在单元格 E > AC 上添加 $sheet-&gt;getHighestRow()+0) 时,它将被放置在每列的总计中。不知道为什么,也许你们中的一些人可以找到替代方法或更好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多