portabilis/jasperphp

该软件包已被废弃,不再维护。没有建议替代软件包。

使用JasperReports在PHP中创建报告

安装次数: 1,563

依赖关系: 0

建议者: 0

安全: 0

星标: 0

关注者: 11

分支: 118

语言:HTML

v2.5.0 2017-12-07 11:46 UTC

This package is not auto-updated.

Last update: 2022-04-06 17:34:50 UTC


README

通过JasperReports 6库和JasperStarter v3命令行工具生成报告的软件包。

安装

composer require cossou/jasperphp

简介

本软件包旨在解决编译和处理JasperReports (.jrxml & .jasper 文件)的问题。

为什么?

你是否曾经需要为你的优秀Web应用创建一个包含许多字段的漂亮发票?

我需要,但现有的解决方案并不完美。生成HTML + CSS来制作PDF?这有什么意义?这完全不合适! :)

然后我发现了JasperReports,这是最佳的开源报告解决方案。

我能用这个做什么?

好吧,什么都能做。JasperReports是强大的报告和BI工具。

从他们的网站

JasperReports库是全球最受欢迎的开源报告引擎。它完全用Java编写,能够使用来自任何类型数据源的数据,并生成精确到像素的文档,这些文档可以以包括HTML、PDF、Excel、OpenOffice和Word在内的多种文档格式查看、打印或导出。

我建议使用Jaspersoft Studio来构建你的报告,将其连接到你的数据源(例如MySQL),遍历结果并将其输出到PDF、XLS、DOC、RTF、ODF等。

以下是一些你可以做的事情的例子

  • 发票
  • 报告
  • 列表

示例

“你好,世界”示例。

前往存储库根目录中的示例目录(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.pdfhello_world.rtf

请查看文件src/JasperPHP/JasperPHP.phpcompileprocess函数的API

参数列表

查询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

检查您是否已安装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

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数据源进行一些hack。您需要为每个表、列表和子报告指示数据源表达式。

	<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