Generate dynamic report in Jasper Report

 

I like and use Jasper Report
I have used JFree Report but due to the lack of designing look like Ireport and Jasper Pal i prefer Jasper Report for reporting in java. Eclipse based Brit Report is also available but have not tried yet.

You can make dynamic Reports in Jasper Report .
I am not talking about changing the value of the parameters $P{} but i am talking about generating a report design in runtime.

You can do this in two ways

Jasper Report keeps its design in xml format which has common extension of .jrxml
you can write program using DOM to prepare a valid XML document to fit as a jasper report design and compile that using Jasper compiler.

Another is by preparing the report by coding and the example of the code is here

package dynaReport;

import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JRAlignment;
import net.sf.jasperreports.engine.JRBand;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextElement;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;

public final class DynaReport {

public DynaReport() {

}

public final JasperDesign getPreMatureDesign(
java.sql.ResultSetMetaData data, int ColumnWidth, int reportWidth,
int reportHeight, int gap, boolean landSacpe) throws JRException,
SQLException {
JasperDesign design = (JasperDesign) JRXmlLoader.load(”./design.jrxml”);
System.out.println(design.getOrientation());
if (landSacpe) {
design.setOrientation((byte) (0));
}
design.setPageWidth(reportWidth);
design.setPageHeight(reportHeight);
Map designFieldMap = (HashMap) design.getMainDesignDataset()
.getFieldsMap();
JRBand bandDetail = design.getDetail();
bandDetail.setSplitAllowed(false);
List bandDetailList = bandDetail.getChildren();

JRBand columnHeader = design.getColumnHeader();
List columnHeaderList = (ArrayList) columnHeader.getChildren();
List designFieldList = (ArrayList) design.getMainDesignDataset()
.getFieldsList();

JRDesignStaticText[] staticFields = this.getHeaders(data, ColumnWidth);
JRDesignTextField[] texts = this.getDataSet(data, designFieldMap,
bandDetailList, designFieldList, ColumnWidth);
int x = 0;
int xHeader = 0;
int counter = 0;
for (JRDesignTextField temp : texts) {
staticFields[counter].setX(xHeader);
temp.setX(x);
columnHeaderList.add(staticFields[counter]);

x += ColumnWidth;
if (counter != 0) {
x += gap;
}
xHeader += ColumnWidth;
counter++;

}
return design;
}

private final JRDesignStaticText[] getHeaders(ResultSetMetaData data,
int width) throws SQLException {
int columnCount = data.getColumnCount();
JRDesignStaticText texts[] = new JRDesignStaticText[columnCount];
for (int counter = 1; counter <= columnCount; counter++) {
texts[counter - 1] = new JRDesignStaticText();
texts[counter - 1].setText(data.getColumnName(counter).replace(”_”,
” “));
texts[counter - 1]
.setHorizontalAlignment(JRDesignTextElement.HORIZONTAL_ALIGN_CENTER);
texts[counter - 1].setKey(”staticText-” + counter);
texts[counter - 1].setBold(true);
texts[counter - 1].setMode(JRDesignStaticText.MODE_OPAQUE);
texts[counter - 1].setPdfFontName(”PCS NEPALI”);
texts[counter - 1].setFontName(”SanSerif”);
texts[counter - 1].setFontSize(10);
texts[counter - 1].setWidth(width);
texts[counter - 1].setHeight(30);
texts[counter - 1].setY(0);
}
return texts;

}

private final JRDesignTextField[] getDataSet(ResultSetMetaData data,
Map designFieldMap, List bandDetailList, List designFieldList,
int width) throws SQLException {
int columnCount = data.getColumnCount();
JRDesignTextField fields[] = new JRDesignTextField[columnCount];

for (int counter = 1; counter <= columnCount; counter++) {
fields[counter - 1] = new JRDesignTextField();
String field_name = data.getColumnName(counter);

bandDetailList.add(fields[counter - 1]);

JRDesignField designField = new JRDesignField();

designField.setName(field_name);

// designField.setValueClassName();
designField.setValueClassName(”java.lang.String”);
designFieldList.add(designField);
designFieldMap.put(field_name, designField);

JRDesignExpression exp = new JRDesignExpression();
exp.setValueClassName(”java.lang.String”);
exp.setText(”$F{” + field_name + “}”);

fields[counter - 1].setExpression(exp);
fields[counter - 1].setKey(”textField-” + counter);
fields[counter - 1].setBlankWhenNull(true);
fields[counter - 1].setHeight(20);
fields[counter - 1].setWidth(width);
fields[counter - 1].setY(0);
fields[counter - 1].setFontName(”PCS NEPAL”);
if (data.getColumnClassName(counter).equalsIgnoreCase(
“java.math.BigDecimal”)) {
fields[counter - 1]
.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_RIGHT);
} else {
fields[counter - 1]
.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_LEFT);
}

}
return fields;

}

}

Get the result set meta data from the result set of the sql
like select a,b,c from Tab1 will get u report with 3 fields

3 Responses to “Generate dynamic report in Jasper Report”

  1. Sureshkumar Says:

    I’m planning to use the iReport included in javaJ2EE/Struts/eclipse in creating reports for my web application. I want to dynamically display a field in the report designer based on the field selection made by the user. Is there a way to do this? Please help. Thanks,

  2. niraj Says:

    you can include ireport in your application but the later part will need a deep dive into ireport code

  3. parhuzamos Says:

    Hello,

    Like the source examples!

    Could you, please use a syntax highlighter when displaying source codes? Like this: http://www.java2html.de/applet.html and see the output live here: http://htmledit.squarefree.com/ . This way the source is more readable and one can understand better (and easier to copy&paste). It does not use css.

    Thank you.
    Keep in blogging!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值