Hi everybody,
Today i have played around with JasperReports. Really nice java tool to created very easy reports. I did not find many examples on internet. Therefor I post my first try. I hope this will help other developers starting up with this great tool.
This example runs a query (JDBC connected) with some parameters define in Java. The result is converted to PDF and then zipped.
Test.java file
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
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;
/**
* The Class Test.
*/
public class Test {
/** The Constant LOG. */
private static final Logger LOG = Logger.getLogger(test.class);
/** The Constant BUFFER. */
final static int BUFFER = 10240;
/** The connection. */
static Connection connection = null;
/**
* Connect database.
*/
static void ConnectDatabase() {
try {
// Load the JDBC driver
String driverName = "oracle.jdbc.driver.OracleDriver";
Class.forName(driverName);
// Create a connection to the database
String serverName = "127.0.0.1";
String portNumber = "1521";
String sid = "XE";
String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
String username = "test";
String password = "test";
connection = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
System.err.println("Could not find the database driver");
} catch (Exception e) {
System.err.println("Could not connect to the database");
}
}
/**
* File zip.
*/
static void fileZip() {
BufferedInputStream origin = null;
try
{
FileOutputStream dest = new FileOutputStream("test.zip");
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
byte data[] = new byte[BUFFER];
// get a list of files from current directory
File f = new File("src/.");
String files[] = f.list();
for (int i=0; i<files.length; i++) {
System.out.println("Adding: "+files[i]);
FileInputStream fi = new FileInputStream("src/"+files[i]);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(files[i]);
out.putNextEntry(entry);
int count;
while((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* The main method.
*
* @param args the arguments
*/
public static void main(String[] args) {
JasperReport jasperReport;
JasperPrint jasperPrint;
long start = System.currentTimeMillis();
try {
// Log log4j configuration
final Properties log4jProperties = new Properties();
log4jProperties.load(new FileInputStream("etc/log4j.properties"));
PropertyConfigurator.configure(log4jProperties);
LOG.info("Start");
LOG.info("--------");
LOG.info("Compile Jasper XML Report");
jasperReport = JasperCompileManager.compileReport("src/test.jrxml");
LOG.info("time : " + (System.currentTimeMillis() - start)+ " ms.");
LOG.info("Create Database connection");
ConnectDatabase();
LOG.info("time : " + (System.currentTimeMillis() - start)+ " ms.");
LOG.info("Create parameters");
Map <String, Object> parameters = new HashMap<String, Object>();
parameters.put("ReportTitle", "User Report");
parameters.put("DataFile", "src/test1.jrxml");
parameters.put("IdRange", 10);
LOG.info("Generated report");
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, connection);
LOG.info("time : " + (System.currentTimeMillis() - start)+ " ms.");
LOG.info("Generated PDF");
JasperExportManager.exportReportToPdfFile(jasperPrint, "src/test.pdf");
LOG.info("time : " + (System.currentTimeMillis() - start)+ " ms.");
LOG.info("Create Zip File");
fileZip();
LOG.info("time : " + (System.currentTimeMillis() - start)+ " ms.");
} catch (Exception e) {
e.printStackTrace();
}
LOG.info("--------");
LOG.info("Done");
}
}
JaspersReports test.jrxml (Report template) file.
<?xml version="1.0"?>
<jasperReport
xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="User Overview" pageWidth="595" pageHeight="842" columnWidth="515" leftMargin="40" rightMargin="40" topMargin="50" bottomMargin="50">
<style name="Sans_Bold" isDefault="false" fontName="DejaVu Sans" fontSize="8" isBold="true" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
<style name="Sans_Normal" isDefault="true" fontName="DejaVu Sans" fontSize="8" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
<style name="Title" style="Sans_Bold" fontSize="12"/>
<style name="ColumnHeader" style="Sans_Bold" forecolor="white"/>
<parameter name="ReportTitle" class="java.lang.String"></parameter>
<parameter name="DataFile" class="java.lang.String"></parameter>
<parameter name="IdRange" class="java.lang.Integer"></parameter>
<queryString><![CDATA[SELECT id, displaynaam, puik_id FROM gebruiker WHERE id <=$P{IdRange} order by id]]></queryString>
<field name="id" class="java.lang.Integer"/>
<field name="displaynaam" class="java.lang.String"/>
<field name="puik_id" class="java.lang.String"/>
<title>
<band height="70">
<line>
<reportElement x="0" y="0" width="515" height="1"/>
<graphicElement/>
</line>
<textField isBlankWhenNull="true" bookmarkLevel="1">
<reportElement x="0" y="10" width="515" height="30" style="Sans_Normal"/>
<textElement textAlignment="Center">
<font size="22"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{ReportTitle}]]></textFieldExpression>
<anchorNameExpression><![CDATA["Title"]]></anchorNameExpression>
</textField>
<textField isBlankWhenNull="true">
<reportElement x="0" y="40" width="515" height="20" style="Sans_Normal"/>
<textElement textAlignment="Center">
<font size="14"/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{DataFile}]]></textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height="15">
<frame>
<reportElement x="0" y="0" width="555" height="15" mode="Opaque" backcolor="black"/>
<staticText>
<reportElement x="5" y="0" width="155" height="15" style="ColumnHeader"/>
<textElement verticalAlignment="Middle" textAlignment="Left"/>
<text>Id</text>
</staticText>
<staticText>
<reportElement x="125" y="0" width="100" height="15" style="ColumnHeader"/>
<textElement verticalAlignment="Middle"/>
<text>Displaynaam</text>
</staticText>
<staticText>
<reportElement x="270" y="0" width="60" height="15" style="ColumnHeader"/>
<textElement verticalAlignment="Middle" textAlignment="Left"/>
<text>PuikId</text>
</staticText>
</frame>
</band>
</pageHeader>
<detail>
<band height="15">
<frame>
<reportElement x="0" y="0" width="555" height="15" />
<textField>
<reportElement x="5" y="0" width="155" height="15"/>
<textElement verticalAlignment="Middle" textAlignment="Left"/>
<textFieldExpression>$F{id}.toString()</textFieldExpression>
</textField>
<textField>
<reportElement x="125" y="0" width="100" height="15"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression>$F{displaynaam}</textFieldExpression>
</textField>
<textField pattern="#,###.00">
<reportElement x="270" y="0" width="60" height="15"/>
<textElement verticalAlignment="Middle" textAlignment="Left"/>
<textFieldExpression>$F{puik_id}</textFieldExpression>
</textField>
</frame>
</band>
</detail>
<pageFooter>
<band height="40">
<line>
<reportElement x="0" y="10" width="515" height="1"/>
<graphicElement/>
</line>
<textField>
<reportElement x="200" y="20" width="80" height="15"/>
<textElement textAlignment="Right"/>
<textFieldExpression class="java.lang.String"><![CDATA["Page " + String.valueOf($V{PAGE_NUMBER}) + " of"]]></textFieldExpression>
</textField>
<textField evaluationTime="Report">
<reportElement x="280" y="20" width="75" height="15"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[" " + String.valueOf($V{PAGE_NUMBER})]]></textFieldExpression>
</textField>
</band>
</pageFooter>
<lastPageFooter>
<band height="60">
<textField bookmarkLevel="1">
<reportElement x="0" y="10" width="515" height="15"/>
<textElement textAlignment="Center"/>
<textFieldExpression class="java.lang.String"><![CDATA["There were " +
String.valueOf($V{REPORT_COUNT}) +
" address records on this report."]]></textFieldExpression>
<anchorNameExpression><![CDATA["Summary"]]></anchorNameExpression>
</textField>
<line>
<reportElement x="0" y="30" width="515" height="1"/>
<graphicElement/>
</line>
<textField>
<reportElement x="200" y="40" width="80" height="15"/>
<textElement textAlignment="Right"/>
<textFieldExpression class="java.lang.String"><![CDATA["Page " + String.valueOf($V{PAGE_NUMBER}) + " of"]]></textFieldExpression>
</textField>
<textField evaluationTime="Report">
<reportElement x="280" y="40" width="75" height="15"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[" " + String.valueOf($V{PAGE_NUMBER})]]></textFieldExpression>
</textField>
</band>
</lastPageFooter>
</jasperReport>
Log4j.properties file
log4j.rootLogger=INFO, console, logfile
log4j.appender.logfile.File=../log/test.log
# Appender to log4j.log
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.MaxFileSize=1000KB
log4j.appender.logfile.MaxBackupIndex=9
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss,SSS} %-5p (%c:%L) - %M: %m%n
log4j.appender.logfile.Append=true
# Appender to Console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss,SSS} %-5p (%c:%L) - %M: %m%n