Hướng dẫn gọi báo cáo JasperReport trong ứng dụng Java
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Download thư viện JasperReport cho Java

Chú ý: Việc download chuyển sang sourceforce, nó rất chậm đôi khi là không download nổi. Đây là một vấn đề thực sự của sourceforce.

Nếu việc download không thành công bạn có thể thử với Link sau:
Kết quả 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 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.
Bạn có thể xem hướng dẫn download JDBC Driver tại:

3- Chuẩn bị báo cáo

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 thư viện điều khiển Database 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 Database 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 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 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 database 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!");
   }
}