使用 Laravel 的 maatwebsite/excel 包我正在尝试将其中包含图表的 XLSX 导出为 PDF。
如果我导出为 xlsx 文件,我可以看到图表,但是当导出为 PDF 时不显示图表。
我已经尝试过所有的 PDF 渲染器:
没有任何成功。
使用 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 [];
}
}
你试过的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;
}
}
试用一下,请更新。