Sử dụng Jaspersoft Report để làm report trên Laravel

Bài viết này sẽ hướng dẫn cách tạo một report trên Laravel sử dụng JasperReport (iReport). Jasper Report có thể tạo một báo cáo tốt với rất nhiều lĩnh vực cho các ứng dụng web của bạn không chỉ tạo ra HTML, CSS để làm cho một file PDF. Với Jasper Report bạn có thể tạo báo cáo chứa các biểu đồ, hình ảnh, report con, Barcode ... Hỗ trợ nhiều kiểu cơ sở dữ liệu và xuất bản các báo cáo dưới dạng PDF, RTF, XML, XLS, CSV, HTML, XHTML, văn bản, DOCX, hoặc OpenOffice.


1. Yêu cầu:
- Laravel framework (Ở đây tôi sử dụng phiên bản 5.0 để demo)
Mysql Connector (Nếu bạn sử dụng MySQL database)
Jaspersoft Studio (Thiết kế, chỉnh sửa các report)
Java JDK 1.6 or higher

2. Cài đặt
- Trong file composer.json  bạn thêm:
{
    "require": {
    "cossou/jasperphp": "dev-master",
    }
}
=> Sau đó chạy command trên laravel :
composer update
- Trong file config/app.php khai báo một providers :
'JasperPHP\JasperPHPServiceProvider',

3. Thiết kế Report

Khởi động phần mềm jaspersoft studio và vào menu “File” => “New” => “Jasper Report”:
=> Chọn một template cho report của bạn, hoặc nếu không bạn có thể chọn Blank page để tự xây dựng từ đầu:

- Tạo mới một report có tên là : codelution.jrxml
=> Nhấn Next
Bây giờ bạn sẽ phải tạo một Connect tới Database, Nhấn nút “New” và chọn “Databae JDBC Connection”:
- Chọn driver “com.mysql.jdbc.Driver” và thay đổi database trên JDBC Url, sau đó chọn tiếp tab “Driver Classpath”:

- Nhấn nút "add" và chọn “mysql-connector-java.jar”:

Sau khi thêm mysql connector jar, bạn có thể test connect bằng cách nhấn nút “Test” để biết bạn đã kết nối thành công hay chưa.

Bây giờ bạn sẽ chọn các field sẽ hiển thị trên report, ở đây tôi chọn tất cả các field trong bảng, bạn có thể nhập một câu SQL thuần ở đây với đầy đủ các thuộc tính của SQL Query


Bây giờ chúng ta có thể kiểm tra Report hiển thị như thế nào bằng cách chọn tab Preview  và nhấn nút “run”:

Sau khi hoàn thành việc tạo Report, chúng ta hãy generate jasper file để sử dụng trên laravel, chỉ cần nhấn nút “Build All”. File report sẽ được tạo ra trong work space mà bạn khai báo lúc chạy phần mềm jaspersoft studio .

=> Cope jasper file vừa tạo ra vào thư mục public của laravel

- Tạo một controller có tên : ReportController với nội dung:
<?php namespace App\Http\Controllers;

class ReportController extends Controller {

 public function __construct()
 {
  $this->middleware('guest');
 }


    /**
     * Display a listing of the user.
     *
     * @return Response
     */

    public function index()

    {
        return view('report');
    }


    public function post()
    {
        $database = \Config::get('database.connections.mysql');

        $output = public_path() . '/report/'.time().'_codelution';

        $ext = "pdf";

        \JasperPHP::process(
            public_path() . '/report/codelution.jasper',
            $output,
            array($ext),
            array(),
            $database,
            false,
            false
        )->execute();

        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.time().'_codelution.'.$ext);
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($output.'.'.$ext));
        flush();
        readfile($output.'.'.$ext);
        unlink($output.'.'.$ext); // deletes the temporary file

        return Redirect::to('/reporting');
    }
}

- Tạo một view có tên: report.blade.php có nội dung:
@extends('app')

@section('content')

<div class="container">
 <div class="row">
  <div class="col-md-10 col-md-offset-1">
   <div class="panel panel-default">
    <div class="panel-heading">Report</div>
    <div class="panel-body">
     <form class="form-horizontal" role="form" method="POST" action="/reporting">
      <input type="hidden" name="_token" value="{{{ csrf_token() }}}" />
                     <div class="form-group">
                         <div class="col-sm-offset-3 col-sm-5">
                             <button type="submit" class="btn btn-primary">Generate</button>
                         </div>
                     </div>
                 </form>
    </div>
   </div>
  </div>
 </div>
</div>

@endsection

- Khai báo trong routes.php :
Route::get('/reporting', ['uses' =>'ReportController@index', 'as' => 'Report']);
Route::post('/reporting', ['uses' =>'ReportController@post']);

Kiểm tra kết quả bằng cách vào : http://localhost:8000/reporting

Chúc bạn thành công !
Tham khảo thêm tại : https://github.com/cossou/JasperPHP

6 nhận xét:

  1. Bạn có thể hướng dẫn thêm parameter vào trong Report, và truyền giá trị cho parameter từ form trong view report.blade.php. Xin cảm ơn!

    Trả lờiXóa
    Trả lời
    1. - Trong File report bạn edit phần queryString thêm mệnh đề where để đưa parameter vào (Ví dụ: ... where CREATE_ID = $P{createID}])
      - Trong Controller, bạn truyền param vào report bằng cách:
      \JasperPHP::process(public_path() . '/report/ticket.jrxml', $output, array(
      $ext
      ), array(
      "createID" => $createID
      ), $database, false, false)->execute();

      Xóa
    2. Mình làm thành công rồi, cảm ơn bạn rất nhiều.

      Xóa
  2. Mình đang gặp một lỗi về Font trong file PDF, sau khi tạo report bằng jaspersoft Studio hiển thị tiếng việt bình thường.(Ví dụ mình tạo một TextFiield có nội dung: "BÁO CÁO CÁC LOẠI SẢN PHẨM", dùng Laravel 5 xuất ra file PDF như bạn hướng dẫn thì Font bị nhiễu khi có dấu (hỏi, nặng, ngã)ví dụ: "BÁO CÁO CÁC LOI SN PHM". Bạn có thử khắc phục giúp mình được không, chân thành cảm ôn!

    Trả lờiXóa
    Trả lời
    1. Chào bạn, khi xuất pdf bằng ireport chỉ có một số font hỗ trợ tiếng Việt như : arial, time, ... Nếu bạn muốn đưa font utf-8 nào đặc biệt phải phải add font vào , bạn thử tham khảo ở đây nhé: https://johnwilfred.wordpress.com/2010/11/03/adding-fonts-to-jasper-based-pdf-reports/

      Xóa
  3. Chào Bạn, Mình nhờ bạn chỉ giúp cách truyền nhiều tham số vào hàm:
    \JasperPHP::process(public_path() . '/report/ticket.jrxml', $output, array(
    $ext
    ), array(
    "createID" => $createID
    ), $database, false, false)->execute();
    mình truyền các tham số cách nhau bởidấu "," thì nó báo lỗi ko xuất ra file đc.

    Trả lờiXóa

Rất mong các ý kiến của các bạn khi đọc bài viết này !