Laravel Excel 中如何让所有单元格自动换行并完成所有边框

问题描述 投票:0回答:4

我想用 Laravel Excel 导出结果,但结果与我想要的不符。

我想要的就是这样的

我希望所有单元格都包含在文本中并具有完整的边框。

这是我的代码:

class SdgsExportView2 implements FromView, WithTitle {

    protected $id_perangkat_daerah;

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

    public function view(): View
    {
        $data_sdgs = DataSdgs::where('id_perangkat_daerah',$this->id_perangkat_daerah)
        ->with('indikator.target.sdgs')
        ->with('detail_data_sdgs.kegiatan.program.perangkat_daerah')
        ->get();
        return view('template.exportMatrik2', [
            'data_sdgs' => $data_sdgs
        ]);
    }

    public function registerEvents(): array
    {
        return [
            AfterSheet::class    => function(AfterSheet $event) {
                $cellRange = 'A1:W100'; // All headers
                $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(14);
                $event->sheet->getDelegate()->getStyle($cellRange)->getAlignment()->setWrapText(true);
            }
        ];
    }

    public function title() : string
    {
        return 'MATRIK 2';
    }
}

我真的希望得到你的帮助

excel laravel phpspreadsheet maatwebsite-excel laravel-excel
4个回答
4
投票

我知道现在回答有点晚了(8个月后),但是向代码添加边框格式相对简单。 在您的事件函数

AfterSheet::class    => function(AfterSheet $event)
中,您需要添加以下代码:

    $styleHeader = [
                'borders' => [
                    'allBorders' => [
                        'borderStyle' => 'thin',
                        'color' => ['rgb' => '808080']
                    ],
                ]
            ];
    $event->sheet->getStyle("A1:C1")->applyFromArray($styleHeader);

并将“A1:C1”替换为您的标题范围。


0
投票

对我来说,我通过扩展添加了事件

WithEvents
并使用

 use Maatwebsite\Excel\Concerns\WithEvents;

然后我就这样申请....

public function registerEvents(): array
{
    $alphabetRange  = range('A', 'Z');
    $alphabet       = $alphabetRange[$this->totalValue+6]; // returns Alphabet

    $totalRow       = (count($this->attributeSets) * 3) + count($this->allItems)+1;
    $cellRange      = 'A1:'.$alphabet.$totalRow;

    return [
        AfterSheet::class    => function(AfterSheet $event) use($cellRange) {
            $event->sheet->getStyle($cellRange)->applyFromArray([
                'borders' => [
                    'allBorders' => [
                        'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
                        'color' => ['argb' => '000000'],
                    ],
                ],
            ])->getAlignment()->setWrapText(true);
        },
    ];
}

有关详细信息或更多信息,您可以关注该文档https://docs.laravel-excel.com/3.1/getting-started/


0
投票

@Zahid 回答 v3.1 的一点更新

public function registerEvents(): array
        {
            return [
                AfterSheet::class    => function(AfterSheet $event) {

                    $alphabet       = $event->sheet->getHighestDataColumn();
                    $totalRow       = $event->sheet->getHighestDataRow();
                    $cellRange      = 'A7:'.$alphabet.$totalRow;

                    $event->sheet->getStyle($cellRange)->applyFromArray([
                        'borders' => [
                            'allBorders' => [
                                'borderStyle' => Border::BORDER_HAIR,
                            ],
                        ],
                    ])->getAlignment()->setWrapText(true);

                },
            ];
        }

-1
投票

要换行单元格,请传递 $start 和 $end 单元格值

$this->spreadsheet->getActiveSheet()->mergeCells($start.':'.$end);

我认为这个助手可以让您的任务变得简单,并帮助您找到您想要的东西: phpspreadsheet 更简单

有一个方法

// $titleName : pass data that you wants to set (not array)
// $mergeTill : pass count of array dataset (Int)

public function setTitle($titleName, $mergeTill, $startCell ,$styleName = "")

通过给出的示例链接

查看此示例
© www.soinside.com 2019 - 2024. All rights reserved.