Pessoal,
tive muita dificuldade de encontrar algum exemplo de relatório dinamico simples e facil.
Então vou postar um exemplo de relatório dinamico feito todo com JasperDesign (Classe do JasperReport).
O Relatório abaixo gera uma tabela com 4 colunas (id,data,hora,status). Para tornar o relatório dinamico basta criar métodos que manipulem o conteúdo. Segue após o relatório um exemplo de um método q gera um Field, o que muda é só o local do código, como vocês podem ver
public class RelatorioDesign extends HttpServlet{
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
{
try{
// Gera o Design do relatório
JasperDesign desenho = getJasperDesign();
// Gera um .Jasper para vizualizar no IReport: (Só para teste no IReport)
//JasperCompileManager.compileReportToFile(desenho, "D:\\Design.jasper");
Map parametros = new HashMap();
// Compila o Relatório
JasperReport jr = JasperCompileManager.compileReport(desenho);
// Gera uma lista com os Forms (Ou seja a lista com o objeto que voce deseja exibir no relatorio)
ArrayList lista = new ArrayList();
lista.add(new Form());
// Cria um PDF para o Relatório
JRBeanCollectionDataSource jrBean = new JRBeanCollectionDataSource(lista);
JasperPrint impressao = JasperFillManager.fillReport(jr, parametros, jrBean);
byte[] b = JasperExportManager.exportReportToPdf(impressao);
// Exibe o PDF
ServletOutputStream ouputStream;
ouputStream = response.getOutputStream();
response.setContentType("application/pdf");
response.setContentLength(b.length);
ouputStream.write(b, 0, b.length);
ouputStream.flush();
ouputStream.close();
}
catch(Exception e){
e.printStackTrace();
}
}
private JasperDesign getJasperDesign() throws JRException {
// ------------------- PÁGINA -------------------
JasperDesign jasperDesign = new JasperDesign();
jasperDesign.setName("RelatorioDinamico");
jasperDesign.setPageWidth(600);
jasperDesign.setPageHeight(1000);
jasperDesign.setColumnCount(1);
jasperDesign.setColumnWidth(540);
jasperDesign.setColumnSpacing(0);
jasperDesign.setLeftMargin(0);
jasperDesign.setRightMargin(0);
jasperDesign.setTopMargin(0);
jasperDesign.setBottomMargin(0);
// ------------------- FIELDS -------------------
JRDesignField field = new JRDesignField();
field.setName("hora");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("data");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("status");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("id");
field.setValueClass(java.lang.Integer.class);
jasperDesign.addField(field);
// ------------------- TITLE -------------------
JRDesignBand band = new JRDesignBand();
band.setHeight(70);
JRDesignStaticText staticText = new JRDesignStaticText();
staticText.setX(189);
staticText.setY(18);
staticText.setWidth(233);
staticText.setHeight(32);
staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
staticText.setFontName("Tahoma");
staticText.setPdfFontName("Helvetica-Bold");
staticText.setFontSize(24);
staticText.setBold(true);
staticText.setText("Relatorio Dinamico");
band.addElement(staticText);
jasperDesign.setTitle(band);
// ------------------- PAGE HEADER -------------------
band = new JRDesignBand();
band.setHeight(15);
jasperDesign.setPageHeader(band);
// ------------------- COLUMN HEADER -------------------
band = new JRDesignBand();
band.setHeight(22);
jasperDesign.setColumnHeader(band);
//Coluna
staticText = new JRDesignStaticText();
staticText.setX(216);
staticText.setY(2);
staticText.setWidth(56);
staticText.setHeight(19);
staticText.setBackcolor(Color.GRAY);
staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
staticText.setText("Data");
band.addElement(staticText);
//Coluna
staticText = new JRDesignStaticText();
staticText.setX(272);
staticText.setY(2);
staticText.setWidth(108);
staticText.setHeight(19);
staticText.setBackcolor(Color.GRAY);
staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
staticText.setText("Hora");
band.addElement(staticText);
//Coluna
staticText = new JRDesignStaticText();
staticText.setX(156);
staticText.setY(2);
staticText.setWidth(60);
staticText.setHeight(19);
staticText.setBackcolor(Color.GRAY);
staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
staticText.setText("ID");
band.addElement(staticText);
//Coluna
staticText = new JRDesignStaticText();
staticText.setX(380);
staticText.setY(2);
staticText.setWidth(64);
staticText.setHeight(19);
staticText.setBackcolor(Color.GRAY);
staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
staticText.setText("Status");
band.addElement(staticText);
// ------------------- DETAIL -------------------
band = new JRDesignBand();
band.setHeight(20);
// Campo
JRDesignTextField textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(216);
textField.setY(5);
textField.setWidth(56);
textField.setHeight(14);
textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
JRDesignExpression expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{data}");
textField.setExpression(expression);
band.addElement(textField);
// Campo
textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(272);
textField.setY(5);
textField.setWidth(108);
textField.setHeight(14);
textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{hora}");
textField.setExpression(expression);
band.addElement(textField);
// Campo
textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(380);
textField.setY(5);
textField.setWidth(64);
textField.setHeight(14);
textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{status}");
textField.setExpression(expression);
band.addElement(textField);
// Campo
textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(156);
textField.setY(5);
textField.setWidth(60);
textField.setHeight(14);
textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_CENTER);
expression = new JRDesignExpression();
expression.setValueClass(java.lang.Integer.class);
expression.setText("$F{id}");
textField.setExpression(expression);
band.addElement(textField);
jasperDesign.setDetail(band);
// ------------------- COLUMN FOOTER -------------------
band = new JRDesignBand();
band.setHeight(5);
jasperDesign.setColumnFooter(band);
// ------------------- PAGE FOOTER -------------------
band = new JRDesignBand();
band.setHeight(5);
jasperDesign.setPageFooter(band);
// ------------------- SUMARY -------------------
band = new JRDesignBand();
band.setHeight(5);
jasperDesign.setSummary(band);
return jasperDesign;
}
}
Exemplo Método Gera Field:
// (...)
private enum tipoColunas{
ID("java.lang.Integer"),
DATA("java.lang.String"),
HORA("java.lang.String"),
STATUS("java.lang.String");
private String tipo;
tipoColunas(String tipo){
this.tipo = tipo;
}
}
// (...)
private JRDesignField insereField(String coluna){
JRDesignField field = new JRDesignField();
field.setName(coluna);
// Recupera o tipo do Field dinamico
String tipo = tipoColunas.valueOf(coluna.toUpperCase()).tipo;
field.setValueClassName(tipo);
return(field);
}
Espero ajudar o pessoal que tenham q fazer essa tristeza. Acho que fica bem facil com o exemplo, o resto é só a lógica do que você quer fazer.
DICA: Analizem o código dentro do .jrxml estático que vocês querem tornar dinamico. Vai facilitar o entendimento.
Abraço.