mokhosh / laravel-reporter
在 Laravel 中创建 PDF 和 Excel 报表,并使用 Tailwind CSS 进行样式设计。
Requires
- php: ^8.0
- illuminate/support: ^8.0
- maatwebsite/excel: ^3.1
- nesk/puphpeteer: ^2.0
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.5.0
README
这基本上是一个 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 包模板生成。