使用 Laravel 的 maatwebsite/excel 不导出 PDF 的图表

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

使用 Laravel 的 maatwebsite/excel 包我正在尝试将其中包含图表的 XLSX 导出为 PDF。

如果我导出为 xlsx 文件,我可以看到图表,但是当导出为 PDF 时不显示图表。

我已经尝试过所有的 PDF 渲染器:

  • dompdf/dompdf
  • mpdf/mpdf
  • tecnickcom/tcpdf

没有任何成功。

使用 AfterSheet 我设法将图表呈现到外部文件。但是我无法将图表输出为 PDF。

// SecondSheet

public function registerEvents(): array
{
    return  [
        AfterSheet::class => function (AfterSheet $event) {
            $worksheet = $event->sheet->getDelegate();
            $chartNames = $worksheet->getChartNames();
            foreach ($chartNames as $chartName) {
                $chart = $worksheet->getChartByName($chartName);
                $chart->render(storage_path('app/' . $chartName . '.png'));
            }
        }
    ];
}

我将文件导出为:

Excel::store(new TheReportExport($myCollection), $fileName, null, MaatwebsiteExcel::MPDF);

TheReportExport
文件看起来像:

<?php

namespace App\Exports;

use App\Exports\Sheets\FirstSheet;
use App\Exports\Sheets\SecondSheet;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Maatwebsite\Excel\Events\BeforeWriting;

class TheReportExport implements WithMultipleSheets, WithEvents
{
    private $data;
    public function __construct(Collection $data)
    {
        $this->data = $data;
    }
    public function sheets(): array
    {
        $sheets = [];
        $sheets[] = new FirstSheet($this->data);
        $sheets[] = new SecondSheet($this->data);
        return $sheets;
    }
    public function registerEvents(): array
    {
        return [];
    }
}
laravel mpdf maatwebsite-excel phpoffice-phpspreadsheet
1个回答
0
投票

你试过的PDF渲染器好像不能直接渲染Excel文件中的图表。一种解决方案是将图表转换为图像,然后将图像插入 PDF。正如您已经完成的那样,您可以使用图表的渲染方法来创建 PNG 图像。然后,您可以使用 Maatwebsite\Excel\Classes 命名空间中的 Drawing 类来创建图像实例并将其插入到 PDF 中。

这是一个示例,说明如何修改 SecondSheet 类以在 PDF 中包含图表图像:

use Maatwebsite\Excel\Classes\PHPExcel;
use Maatwebsite\Excel\Classes\PHPExcel\Worksheet\Drawing;
use Maatwebsite\Excel\Sheet;
use Maatwebsite\Excel\Events\AfterSheet;

class SecondSheet implements Sheet
{
    private $data;
    public function __construct(Collection $data)
    {
        $this->data = $data;
    }
    public function registerEvents(): array
    {
        return [
            AfterSheet::class => function (AfterSheet $event) {
                $worksheet = $event->sheet->getDelegate();
                $chartNames = $worksheet->getChartNames();
                foreach ($chartNames as $chartName) {
                    $chart = $worksheet->getChartByName($chartName);
                    $imagePath = storage_path('app/' . $chartName . '.png');
                    $chart->render($imagePath);
                    $drawing = new Drawing();
                    $drawing->setName($chartName);
                    $drawing->setDescription($chartName);
                    $drawing->setPath($imagePath);
                    $drawing->setHeight(300);
                    $drawing->setWidth(400);
                    $drawing->setCoordinates('A10');
                    $drawing->setWorksheet($worksheet);
                }
            }
        ];
    }
    public function title(): string
    {
        return 'Second Sheet';
    }
    public function getDelegate(): PHPExcel_Worksheet
    {
        $sheet = new PHPExcel_Worksheet(null, $this->title());
        // Add data to the sheet
        // ...
        return $sheet;
    }
}

试用一下,请更新。

© www.soinside.com 2019 - 2024. All rights reserved.