mokhosh/laravel-reporter

在 Laravel 中创建 PDF 和 Excel 报表,并使用 Tailwind CSS 进行样式设计。

v0.15.5 2021-12-23 12:52 UTC

README

Latest Version on Packagist Total Downloads

这基本上是一个 Excel 生成器和 PDF 生成器的包装器。目前这些生成器是 Maatweb 和 Barry's snappy,将来可能会有所改变。

已经有一个包可以做到这一点,但我不喜欢它的 API、编码风格和整体设计,当然,这是出于对所有人的尊重。

要求

此包需要 PHP 8。

安装

您可以通过 composer 安装此包。请确保运行 Artisan 安装命令以安装 npm 依赖项。

composer require mokhosh/laravel-reporter
php artisan reporter:install

您可能不需要在客户端执行任何其他操作。但在某些服务器上,您可能需要更多的依赖项。例如,在 Ubuntu 上,您可以通过运行 ldd chrome | grep not 来获取 Headless Chrome 需要运行但您没有的依赖项列表。然后,您可以通过运行 apt install 来安装它们。以下是帮助您完成此任务的指南: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md

用法

这是获取 PDF 的最简单方法。这将报告所有非隐藏列

use Mokhosh\Reporter\Reporter;

$users = User::query();

return Reporter::report($users)->pdf(); // view in browser, aka inline

如果您更喜欢下载 PDF 文件而不是在浏览器中显示它,您可以这样做

return Reporter::report($users)->download()->pdf(); // download, aka attachment

您可以下载您报告的 Excel 版本

return Reporter::report($users)->excel();

样式和转换

如果您不传递过滤器,Reporter 将使用您的数据库列来创建其表格。但如果您使用过滤器,您可以使用模型上的任何 accessor,并且您可以过滤掉一些列,如下所示

$filter = [
    'id',
    'name',
    'email',
    'created_at',
];
return Reporter::report($users, $filter)->pdf();

这将使用标题大小写的列名来创建您的表格标题。如果您希望使用自定义表格标题,您可以这样做

$filter = [
    'id' => 'ID',
    'email' => '@',
    'created_at' => 'Joined',
];

您还可以通过传递闭包来转换数据

$filter = [
    'created_at' => fn($date) => $date->format('Y-m'),
];

如果您想,您还可以为表格单元格添加 Tailwind CSS 类。酷,对吧?

$filter = [
    'id' => [
        'class' => 'font-bold text-gray-600 bg-gray-50'
    ],
];

您还可以以千万种方式混合匹配

$filter = [
    'id' => 'ID',
    'name',
    'email' => [
        'transform' => fn($email) => strtoupper($email),
        'class' => 'text-green-700 bg-green-100',
    ],
    'created_at' => fn($date) => $date->format('Y-m'),
    'updated_at' => [
        'title' => 'Last Seen',
        'class' => 'text-red-400',
    ],
];

整个 model 也传递给 transform 闭包,因此如果需要,您可以访问其他列

$filter = [
    'amount' => fn($amount, $model) => $model->currency . $amount,
];

有了这个,您甚至可以创建在您的模型和数据库上不存在的虚构列

$filter = [
    'madeup_name' => fn($_, $model) => $model->amount * $model->discount,
];

请注意,因为这个列实际上不是数据库列或甚至不是您模型上的 accessor,第一个参数将是 null。这就是为什么我将它命名为 $_

您还可以更改生成的 PDF 的标题并添加元数据

$title = 'Users Report';
$meta = [
    'Admin' => 'Mo Khosh',
];

return Reporter::report($query, $columns, $title, $meta, footer: true)->pdf();

您可以选择在页脚显示生成日期、总页数和页码

return Reporter::report($query, $columns, footer: true)->pdf();

您可以在页眉中放置您的徽标

return Reporter::report($query, $columns, logo: 'https://address-to-logo.com')->pdf();

待办事项

  • 我在考虑添加标题类
$filter = [
    'id' => 'ID',
    'email' => [
        'class' => 'text-green-700 bg-green-100',
        'header-class' => 'text-green-100 bg-green-700',
    ],
];

我也在考虑添加条件类,当单元格的内容满足通过闭包返回布尔值的条件时,这些类会被添加到单元格中。

$filter = [
    'created_at' => [
        'conditional-classes' => [
            [
                'class' => 'text-red-600',
                'condition' => fn($date) => $date->gt(now()->subWeek()),
            ],
            [
                'class' => 'text-green-600',
                'condition' => fn($date) => $date->lt(now()->subYear()),
            ],
        ],
    ],
];
  • 一个好的 API 是传递默认样式给表头,甚至给奇偶行
  • 添加带有页码、日期等的标题和页脚

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的更多信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

鸣谢

许可证

麻省理工学院许可证(MIT)。有关更多信息,请参阅许可证文件

Laravel 包模板

此包使用Laravel 包模板生成。