lopezsoft / jasperphp
使用 JasperReports 在 PHP 中创建报告
Requires
- php: >= 7.4
Requires (Dev)
- phpunit/phpunit: ^8.5.33
README
通过 JasperReports 6 库,使用 JasperStarter v3.6.2 命令行工具生成报告。
安装
composer require lopezsoft/JasperPHP
简介
此包旨在成为编译和处理 JasperReports (.jrxml & .jasper 文件) 的解决方案。
为什么?
你是否曾经需要为你的伟大网络应用创建一个具有许多字段的精美发票?
我必须这么做,而现有的解决方案并不完美。生成 HTML + CSS 来创建 PDF?WTF?这没有任何意义! :)
然后我发现了 JasperReports,这是最佳的开放源代码报告解决方案。
我能用它做什么?
嗯,一切。JasperReports 是 报告 和 BI 的强大工具。
从他们的网站上
JasperReports 库是全球最受欢迎的开放源代码报告引擎。它完全用 Java 编写,能够使用来自任何类型数据源的数据,并生成精确的文档,可以以各种文档格式查看、打印或导出,包括 HTML、PDF、Excel、OpenOffice 和 Word。
我建议使用 Jaspersoft Studio 来构建你的报告,将其连接到你的数据源(例如 MySQL),遍历结果并将输出到 PDF、XLS、DOC、RTF、ODF 等。
你可以做的一些示例
- 发票
- 报告
- 列表
示例
《Hello World》示例。
前往存储库根目录中的示例目录(vendor/lopezsoft/jasperphp/examples
)。使用 iReport 或你的首选文本编辑器打开 hello_world.jrxml
文件,查看源代码。
编译
首先,我们需要将我们的 JRXML
文件编译成 JASPER
二进制文件。我们只需做一次。
注意:如果你使用的是 Jaspersoft Studio,则无需执行此步骤。你可以在程序内部直接编译。
JasperStartet::compile(base_path('/vendor/lopezsoft/JasperPHP/examples/hello_world.jrxml'))->execute();
此命令将编译 hello_world.jrxml
源文件到 hello_world.jasper
文件。
注意:如果你使用 Laravel 4,请运行 php artisan tinker
并复制粘贴上述命令。
处理
现在让我们处理之前编译的报告
JasperStartet::process( base_path('/vendor/lopezsoft/JasperPHP/examples/hello_world.jasper'), false, array('pdf', 'rtf'), array('php_version' => phpversion()) )->execute();
现在查看示例文件夹! :) 很棒,对吧?你现在有了两个文件,hello_world.pdf
和 hello_world.rtf
。
查看 src/JasperPHP/JasperStartet.php
文件中 compile
和 process
函数的 API。
列表参数
查询 Jasper 文件以检查给定 Jasper 报告文件中可用的参数
$output = JasperStartet::list_parameters( base_path('/vendor/lopezsoft/JasperPHP/examples/hello_world.jasper') )->execute(); foreach($output as $parameter_description) echo $parameter_description;
高级示例
我们还可以指定连接到数据库的参数
JasperStartet::process( base_path('/vendor/lopezsoft/JasperPHP/examples/hello_world.jasper'), false, array('pdf', 'rtf'), array('php_version' => phpversion()), array( 'driver' => 'postgres', 'username' => 'vagrant', 'host' => 'localhost', 'database' => 'samples', 'port' => '5433', ) )->execute();
要求
- Java JDK 1.8
- PHP 7.4
- PHP exec() 函数
- [可选] Mysql Connector(如果你想使用数据库)
- [可选] Jaspersoft Studio(用于绘制和编译你的报告)
安装
Java
检查你是否已经安装了 Java
$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.242-b08, mixed mode)
如果你得到
command not found: java
那么使用以下方式安装它:(Ubuntu/Debian)
$ sudo apt-get install default-jdk
现在再次运行 java -version
并检查输出是否正常。
Composer
如果您还没有,请安装Composer。
composer require lopezsoft/JasperPHP
或者,在您的composer.json
文件中添加:
{ "require": { "lopezsoft/JasperPHP": "^2.9.0", } }
然后只需运行
composer update
就完成了。
现在您将拥有可用的JasperStartet
别名。
MySQL
我们在/src/JasperStarter/jdbc/
目录中提供了MySQL连接器(v5.1.45)。
PostgreSQL
我们在/src/JasperStarter/jdbc/
目录中提供了PostgreSQL(v9.4-1212.jre6)。
注意:Laravel使用pgsql
作为驱动名称,而不是postgres
。
SQLite
我们在/src/JasperStarter/jdbc/
目录中提供了SQLite(版本v056,基于SQLite 3.6.14.2)。
array(
'driver' => 'generic',
'jdbc_driver' => 'org.sqlite.JDBC',
'jdbc_url' => 'jdbc:sqlite:/database.sqlite'
)
JSON
源文件示例
{ "result":{ "id":26, "reference":"0051711080021460005", "account_id":1, "user_id":2, "date":"2017-11-08 00:21:46", "type":"", "gross":138, "discount":0, "tax":4.08, "nett":142.08, "details":[ {"id":26, "line": 1, "product_id": 26 }, ] }, "options":{ "category":[ {"id":3,"name":"Hair care","service":0,"user_id":1, }, ], "default":{ "id":1,"name":"I Like Hairdressing", "description":null, "address":null, "website":"https:\/\/www.ilikehairdressing.com", "contact_number":"+606 601 5889", "country":"MY", "timezone":"Asia\/Kuala_Lumpur", "currency":"MYR", "time_format":"24-hours", "user_id":1 } } }
使用Laravel
public function generateReceipt($id) { $datafile = base_path('/storage/jasper/data.json'); $output = base_path('/storage/jasper/data'); //indicate the name of the output PDF JasperStartet::process( base_path('/resources/reports/taxinvoice80.jrxml'), $output, array("pdf"), array("msg"=>"Tax Invoice"), array("driver"=>"json", "json_query" => "data", "data_file" => $datafile) )->execute(); }
需要对JasperReport数据源进行一些修改。您需要为每个表、列表和子报表指定数据源表达式。
<datasetRun subDataset="invoice_details" uuid="a91cc22b-9a3f-45eb-9b35-244890d35fc7"> <dataSourceExpression> <![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("result.details")]]> </dataSourceExpression> </datasetRun>
性能
取决于复杂度、数据量以及您的机器资源(告诉我您的使用情况)。
我有一个生成带有数据库连接、图像和多页面的发票的报告,它大约需要3/4秒来处理。我建议您使用工作器在后台生成报告。
谢谢
感谢Cenote GmbH提供的JasperStarter工具。
有疑问吗?
在Github上给我发信息lopezsoft。
许可证
MIT