如何在laravel excel版本3中添加列的标题和总和值?

enxuqcxy  于 2022-12-19  发布在  其他
关注(0)|答案(3)|浏览(121)

我从这里得到参考:https://laravel-excel.maatwebsite.nl/docs/3.0/getting-started/basics
所以我用版本3
我的控制器是这样的:

public function exportToExcel(Request $request)
{
    $data = $request->all();
    $exporter = app()->makeWith(SummaryExport::class, compact('data'));   
    return $exporter->download('Summary.xlsx');
}

我的脚本导出到excel如下:

namespace App\Exports;
use App\Repositories\ItemRepository;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\WithHeadings;
class SummaryExport implements FromCollection, WithHeadings {
    use Exportable;
    protected $itemRepository;
    protected $data;
    public function __construct(ItemRepository $itemRepository, $data) {
        $this->itemRepository = $itemRepository;
        $this->data = $data;
    }
    public function collection()
    {
        $items = $this->itemRepository->getSummary($this->data);
        return $items;
    }
    public function headings(): array
    {
        return [
            'No',
            'Item Number',
            'Sold Quantity',
            'Profit'
        ];
    }
}

如果脚本执行,结果如下:

我想在表格上方添加一些说明或标题,并对销售数量列和利润列求和
所以我想要这样的结果:

我已经阅读了文档,并在谷歌搜索,但我没有找到解决方案
有人能帮忙吗?

    • 更新**

根据该参考文献:https://laravel-excel.maatwebsite.nl/docs/3.0/export/extending
我试着补充:

....
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\BeforeExport;
use Maatwebsite\Excel\Events\BeforeWriting;
use Maatwebsite\Excel\Events\BeforeSheet;
use Maatwebsite\Excel\Events\AfterSheet;
class SummaryExport implements FromCollection, WithHeadings, WithColumnFormatting, ShouldAutoSize, WithEvents
{
    ...
    public function registerEvents(): array
    {
        return [
            BeforeExport::class  => function(BeforeExport $event) {
                $event->writer->setCreator('Patrick');
            },
            AfterSheet::class    => function(AfterSheet $event) {
                $event->sheet->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE);

                $event->sheet->styleCells(
                    'B2:G8',
                    [
                        'borders' => [
                            'outline' => [
                                'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                                'color' => ['argb' => 'FFFF0000'],
                            ],
                        ]
                    ]
                );
            },
        ];
    }
}

在我上面的脚本中
但存在如下错误:

Method Maatwebsite\Excel\Sheet::styleCells does not exist
Method Maatwebsite\Excel\Sheet::setOrientation does not exist.
Method Maatwebsite\Excel\Writer::setCreator does not exist.

如何解决错误?

5jvtdoz2

5jvtdoz21#

你必须这样示例化一个数组:-

$export = [];

然后,您必须使用array_push将数据推入其中:-

array_push($export, [
                    'No' => '',
                    'item'=>'',
                    'sold' =>'',
                    'profit' => ''
                ]);

然后你可以这样附加你的计算:-

array_push($export,[' ','Items Count:', '=COUNTA(C2:C'.$Count.')' ,' ','Profit Sum:', '=SUM(D2:D'.$Count.')']);

而如果添加任何标题,则$count = count($array+1)。
你可以使用你正常的细胞功能。

5fjcxozz

5fjcxozz2#

在2022年的最新版本3.1中,这可以以一种非常透明和直接的方式完成。

**1.**对于带有列标题的标题/表头行,可以使用官方方法

public function headings():array{
    return [
        'Column 1',
        'Column 2'
    ];
}

要使其工作,请将WithHeadings添加到类实现部分。

**官方文档:**https:docs.laravel-excel.com/3.1/exports/mapping.html#adding-a-heading-row
**2.**要在数据集末尾添加“summary”行或任何其他行,可以在prepareRows($rows)函数中添加此类行

public function prepareRows($rows){
  $sum = 0;
  foreach($rows as $row)$sum+=$row->column_2;
  $rows[]=[
    'is_summary'=>true,
    'sum_column_1'=>$sum
  ]
}

注意:$rows参数是一个数组。

然后在map($row)函数中添加逻辑以区分正常数据行和汇总行:

public function map($row){
  if(isset($row['is_summary']) && $row['is_summary']===true){
    //Return a summary row
    return [
      'Total sum:',
      $row['sum_column_1']
    ];
  }else{
    //Return a normal data row
    return [
      $row->column_1,
      $row->column_2
    ];
  }
}

要使map函数工作,请将WithMapping添加到类的implements部分。

正式文件:

  • https://docs.laravel-excel.com/3.1/exports/mapping.html#mapping-rows
  • https://docs.laravel-excel.com/3.1/exports/mapping.html#prepare-rows
tzdcorbm

tzdcorbm3#

虽然前面使用prepareRows的建议可能适合您的用例,但它的缺点是无法对脚注行进行样式化。
相反,您可以执行以下操作:

public function collection()
{
    return collect([
        ...$this->itemRepository->getSummary($this->data),
        $this->itemRepository->getTotal($this->data)
    ]);
}

相关问题