nealis / jasperphp
使用 JasperReports 在 PHP 中创建报告
This package is auto-updated.
Last update: 2024-08-29 04:31:39 UTC
README
通过 JasperReports 6 库和 JasperStarter v3 命令行工具生成报告的包。
安装
composer require cossou/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/cossou/jasperphp/examples)。使用 iReport 或您的首选文本编辑器打开 hello_world.jrxml 文件,查看源代码。
编译
首先,我们需要将我们的 JRXML 文件编译成 JASPER 二进制文件。我们只需要这样做一次。
注意:如果您使用的是 Jaspersoft Studio,则不需要执行此步骤。您可以直接在程序中编译。
JasperPHP::compile(base_path('/vendor/cossou/jasperphp/examples/hello_world.jrxml'))->execute();
此命令将编译 hello_world.jrxml 源文件到 hello_world.jasper 文件。
注意:如果您使用 Laravel 4,请运行 php artisan tinker 并复制并粘贴上述命令。
处理
现在让我们处理之前编译的报告
JasperPHP::process( base_path('/vendor/cossou/jasperphp/examples/hello_world.jasper'), false, array('pdf', 'rtf'), array('php_version' => phpversion()) )->execute();
现在查看示例文件夹! :) 很好对吧?您现在有 2 个文件,hello_world.pdf 和 hello_world.rtf。
查看 src/JasperPHP/JasperPHP.php 文件中的 API 的 compile 和 process 函数。
列表参数
查询 jasper 文件以检查给定 jasper 报告文件中可用的参数
$output = JasperPHP::list_parameters( base_path('/vendor/cossou/jasperphp/examples/hello_world.jasper') )->execute(); foreach($output as $parameter_description) echo $parameter_description;
高级示例
我们还可以指定用于连接数据库的参数
JasperPHP::process( base_path('/vendor/cossou/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.6
- PHP exec() 函数
- [可选] Mysql Connector(如果您想使用数据库)
- [可选] Jaspersoft Studio(用于绘制和编译您的报告)
安装
Java
检查您是否已安装Java
$ java -version
java version "1.6.0_51"
Java(TM) SE Runtime Environment (build 1.6.0_51-b11-457-11M4509)
Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-457, mixed mode)
如果您收到
command not found: java
然后使用以下命令安装它(Ubuntu/Debian):
$ sudo apt-get install default-jdk
现在再次运行 java -version 并检查输出是否正常。
Composer
如果您还没有安装,请安装Composer。
composer require cossou/jasperphp
或者在您的 composer.json 文件中添加
{ "require": { "cossou/jasperphp": "~2", } }
然后只需运行
composer update
就完成了。
使用Laravel 5吗?
将 JasperPHP\JasperPHPServiceProvider::class 添加到配置文件 config/app.php 中的服务提供者
文件 config/app.php
<?php //... 'providers' => [ //... Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, //insert jasper service provider here JasperPHP\JasperPHPServiceProvider::class ],
在控制器中通过在命名空间后添加 use JasperPHP 来使用
<?php namespace App\Http\Controllers; use JasperPHP; // put here class SomethingController { //... public function generateReport() { //jasper ready to call JasperPHP::compile(base_path('/vendor/cossou/jasperphp/examples/hello_world.jrxml'))->execute(); } }
在路由中使用
use JasperPHP\JasperPHP as JasperPHP; Route::get('/', function () { $jasper = new JasperPHP; // Compile a JRXML to Jasper $jasper->compile(__DIR__ . '/../../vendor/cossou/jasperphp/examples/hello_world.jrxml')->execute(); // Process a Jasper file to PDF and RTF (you can use directly the .jrxml) $jasper->process( __DIR__ . '/../../vendor/cossou/jasperphp/examples/hello_world.jasper', false, array("pdf", "rtf"), array("php_version" => "xxx") )->execute(); // List the parameters from a Jasper file. $array = $jasper->list_parameters( __DIR__ . '/../../vendor/cossou/jasperphp/examples/hello_world.jasper' )->execute(); return view('welcome'); });
使用Laravel 4吗?
将以下内容添加到您的 app/config/app.php 提供者数组中
'JasperPHP\JasperPHPServiceProvider',
现在您将可以使用 JasperPHP 别名。
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 JasperPHP::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工具。
有问题?
在Twitter上给我留言@cossou。
许可证
MIT