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
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- 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}])
Xóa- 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();
Mình làm thành công rồi, cảm ơn bạn rất nhiều.
XóaMì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óaChà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óaChào Bạn, Mình nhờ bạn chỉ giúp cách truyền nhiều tham số vào hàm:
Trả lờiXóa\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.