openplanning

Gọi báo cáo JasperReport trong ứng dụng Java

  1. Download thư viện JasperReport cho Java
  2. Download thư viện điều khiển Database
  3. Chuẩn bị các báo cáo (Report)
  4. Tạo project Java & khai báo thư viện
  5. Tạo file PDF từ JasperReport
  6. Các class tiện ích giúp kết nối vào một số loại Database
  7. Truyền Datasource và tham số vào báo cáo

1. Download thư viện JasperReport cho Java

Kết quả bạn có được:
Giải nén file zip vừa download được:

2. Download thư viện điều khiển Database

Nếu báo cáo cần kết nối với database bạn cần phải có các thư viện điều khiển loại database này (JDBC Driver Library).
Bạn có thể xem hướng dẫn download JDBC Driver tại:

3. Chuẩn bị các báo cáo (Report)

Bạn cần một file báo cáo JasperReport. Chúng ta sẽ chạy báo cáo đó từ Java. Bạn có thể download một file báo cáo ví dụ tại:
Giải nén file vừa download được, chúng ta sẽ có file jrxml.

4. Tạo project Java & khai báo thư viện

Tạo một project Java thông thường.
  • JavaCallJasperReportTutorial
Tạo một thư mục libs và copy các thư viện tối thiểu cần thiết vào thư mục này.
Bao gồm:
  • commons-beanutils-*.jar
  • commons-collections-*.jar
  • commons-digester-*.jar
  • commons-logging-*.jar
  • groovy-all-*.jar
  • itextpdf-*.jar
  • itext-pdfa-*.jar
  • jasperreports-*.jar
Tiếp theo copy các thư viện JDBC Driver vào thư mục libs, tại đây tôi copy cả 3 loại JDBC Driver điều khiển cho các loại cơ sở dữ liệu Oracle, MySQL, SQLServer.
Để khai báo các thư viện với Project, nhấn phải chuột vào Project và chọn Properties
Chọn hết các file jar trong thư mục libs:

5. Tạo file PDF từ JasperReport

Đây là một ví dụ đơn giản, Java sẽ gọi vào báo cáo JasperReport và tạo ra file PDF. Ví dụ đơn giản này chưa có sự tham gia của Database.
PdfFromXmlFile.java
package org.o7planning.tutorial.javajasperreport;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;

public class PdfFromXmlFile {

   public static void main(String[] args) throws JRException, IOException {

       JasperReport jasperReport = JasperCompileManager
               .compileReport("C:/jasperreport/StyledTextReport/StyledTextReport.jrxml");

       // Tham số truyền vào báo cáo.
       Map<String, Object> parameters = new HashMap<String, Object>();

       // DataSource
       // Đây là báo cáo đơn giản, không kết nối vào DB
       // vì vậy không cần nguồn dữ liệu.
       JRDataSource dataSource = new JREmptyDataSource();

       JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
               parameters, dataSource);

       // Đảm bảo thư mục đầu ra tồn tại.
       File outDir = new File("C:/jasperoutput");
       outDir.mkdirs();

       // Chạy báo cáo và export ra file PDF.
       JasperExportManager.exportReportToPdfFile(jasperPrint,
               "C:/jasperoutput/StyledTextReport.pdf");

       System.out.println("Done!");
   }
}
Kết quả chạy ví dụ:

6. Các class tiện ích giúp kết nối vào một số loại Database

  • Oracle
  • MySQL
  • SQLServer
OracleConnUtils.java
package org.o7planning.tutorial.javajasperreport.conn;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class OracleConnUtils {

   public static Connection getOracleConnection()
           throws ClassNotFoundException, SQLException {
       String hostName = "localhost";
       String sid = "db11g";
       String userName = "learningsql";
       String password = "12345";

       return getOracleConnection(hostName, sid, userName, password);
   }

   public static Connection getOracleConnection(String hostName, String sid,
           String userName, String password) throws ClassNotFoundException,
           SQLException {

       // Khai báo class Driver cho DB Oracle
       // Việc này cần thiết với Java 5
       // Java6 trở lên tự động tìm kiếm Driver thích hợp.
       // Nếu bạn dùng Java > 5, thì ko cần dòng này cũng được.
       Class.forName("oracle.jdbc.driver.OracleDriver");

       // Cấu trúc URL Connection dành cho Oracle
       // Ví dụ: jdbc:oracle:thin:@localhost:1521:db11g
       String connectionURL = "jdbc:oracle:thin:@" + hostName + ":1521:" + sid;

       Connection conn = DriverManager.getConnection(connectionURL, userName,
               password);
       return conn;
   }
}
MySQLConnUtils.java
package org.o7planning.tutorial.javajasperreport.conn;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MySQLConnUtils {

   public static Connection getMySQLConnection()
           throws ClassNotFoundException, SQLException {
       String hostName = "localhost";
       String dbName = "learningsql";
       String userName = "root";
       String password = "12345";
       return getMySQLConnection(hostName, dbName, userName, password);
   }

   public static Connection getMySQLConnection(String hostName, String dbName,
           String userName, String password) throws SQLException,
           ClassNotFoundException {
       // Khai báo class Driver cho DB MySQL
       // Việc này cần thiết với Java 5
       // Java6 trở lên tự động tìm kiếm Driver thích hợp.
       // Nếu bạn dùng Java > 5, thì ko cần dòng này cũng được.
       Class.forName("com.mysql.jdbc.Driver");

       // Cấu trúc URL Connection dành cho Oracle
       // Ví dụ: jdbc:mysql://localhost:3306/simplehr
       String connectionURL = "jdbc:mysql://" + hostName + ":3306/" + dbName;

       Connection conn = DriverManager.getConnection(connectionURL, userName,
               password);
       return conn;
   }
}
SQLServerConnUtils.java
package org.o7planning.tutorial.javajasperreport.conn;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class SQLServerConnUtils {

  // Kết nối vào SQLServer.
  // (Sử dụng thư viện điều khiển SQLJDBC)
  public static Connection getSQLServerConnection_SQLJDBC()
          throws ClassNotFoundException, SQLException {
      String hostName = "localhost";
      String sqlInstanceName = "SQLEXPRESS";
      String database = "learningsql";
      String userName = "sa";
      String password = "12345";

      return getSQLServerConnection_SQLJDBC(hostName, sqlInstanceName,
              database, userName, password);
  }

  // Kết nối vào SQLServer.
  // (Sử dụng thư viện điều khiển JTDS)
  public static Connection getSQLServerConnection_JTDS() throws SQLException,
          ClassNotFoundException {
      String hostName = "learningsql";
      String sqlInstanceName = "SQLEXPRESS";
      String database = "simplehr";
      String userName = "sa";
      String password = "12345";

      return getSQLServerConnection_JTDS(hostName, sqlInstanceName, database,
              userName, password);
  }

  // Trường hợp sử dụng SQLServer.
  // Và thư viện SQLJDBC.
  private static Connection getSQLServerConnection_SQLJDBC(String hostName,
          String sqlInstanceName, String database, String userName,
          String password) throws ClassNotFoundException, SQLException {
      // Khai báo class Driver cho DB SQLServer
      // Việc này cần thiết với Java 5
      // Java6 tự động tìm kiếm Driver thích hợp.
      // Nếu bạn dùng Java6, thì ko cần dòng này cũng được.
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

      // Cấu trúc URL Connection dành cho SQLServer
      // Ví dụ:
      // jdbc:sqlserver://ServerIp:1433/SQLEXPRESS;databaseName=simplehr
      String connectionURL = "jdbc:sqlserver://" + hostName + ":1433"
              + ";instance=" + sqlInstanceName + ";databaseName=" + database;

      Connection conn = DriverManager.getConnection(connectionURL, userName,
              password);
      return conn;
  }

  // Trường hợp sử dụng SQLServer.
  // Và thư viện JTDS.
  private static Connection getSQLServerConnection_JTDS(String hostName,
          String sqlInstanceName, String database, String userName,
          String password) throws ClassNotFoundException, SQLException {
      // Khai báo class Driver cho DB SQLServer
      // Việc này cần thiết với Java 5
      // Java6 tự động tìm kiếm Driver thích hợp.
      // Nếu bạn dùng Java6, thì ko cần dòng này cũng được.
      Class.forName("net.sourceforge.jtds.jdbc.Driver");

      // Cấu trúc URL Connection dành cho SQLServer
      // Ví dụ:
      // jdbc:jtds:sqlserver://localhost:1433/simplehr;instance=SQLEXPRESS
      String connectionURL = "jdbc:jtds:sqlserver://" + hostName + ":1433/"
              + database + ";instance=" + sqlInstanceName;

      Connection conn = DriverManager.getConnection(connectionURL, userName,
              password);
      return conn;
  }

}
ConnectionUtils.java
package org.o7planning.tutorial.javajasperreport.conn;

import java.sql.Connection;
import java.sql.SQLException;

public class ConnectionUtils {

    public static Connection getConnection() throws SQLException,
            ClassNotFoundException {
        // Sử dụng Oracle.
        // Bạn có thể thay thế bởi Database nào đó.
        return OracleConnUtils.getOracleConnection();
    }

    //
    // Test Connection ...
    //
    public static void main(String[] args) throws SQLException,
            ClassNotFoundException {

        System.out.println("Get connection ... ");

        // Lấy ra đối tượng Connection kết nối vào database.
        Connection conn = ConnectionUtils.getConnection();

        System.out.println("Get connection " + conn);

        System.out.println("Done!");
    }
}

7. Truyền Datasource và tham số vào báo cáo

Ví dụ sau đây sẽ phức tạp hơn ví dụ trước. Chúng ta sẽ truyền các tham số và thông tin kết nối tới cơ sở dữ liệu vào báo cáo từ Java.
JavaCallJasperReport.java
package org.o7planning.tutorial.javajasperreport;

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.export.ExporterInput;
import net.sf.jasperreports.export.OutputStreamExporterOutput;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.SimplePdfExporterConfiguration;

import org.o7planning.tutorial.javajasperreport.conn.ConnectionUtils;

public class JavaCallJasperReport {

   public static void main(String[] args) throws JRException,
           ClassNotFoundException, SQLException {

       String reportSrcFile = "F:/ECLIPSE_TUTORIAL/JASPERREPORT/HelloJasperReport/FirstJasperReport.jrxml";
      
       // Compile file nguồn trước.
       JasperReport jasperReport =    JasperCompileManager.compileReport(reportSrcFile);

       Connection conn = ConnectionUtils.getConnection();

       // Tham số truyền vào báo cáo.
       Map<String, Object> parameters = new HashMap<String, Object>();

       JasperPrint print = JasperFillManager.fillReport(jasperReport,
               parameters, conn);

       // Đảm bảo thư mục đầu ra tồn tại.
       File outDir = new File("C:/jasperoutput");
       outDir.mkdirs();

       // PDF Exportor.
       JRPdfExporter exporter = new JRPdfExporter();

       ExporterInput exporterInput = new SimpleExporterInput(print);
       // ExporterInput
       exporter.setExporterInput(exporterInput);

       // ExporterOutput
       OutputStreamExporterOutput exporterOutput = new SimpleOutputStreamExporterOutput(
               "C:/jasperoutput/FirstJasperReport.pdf");
       // Output
       exporter.setExporterOutput(exporterOutput);

       //
       SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
       exporter.setConfiguration(configuration);
       exporter.exportReport();

       System.out.print("Done!");
   }
}