2009-12-20 8 views
4

동적 보고서를 만들려면 jrxml으로 작업 중입니다. 해당 보고서의 열을 매개 변수화 했으므로 jrxml을 사용하여 다른 보고서를 생성 할 수도 있습니다.jrxml을 사용하여 동적 보고서를 작성하는 방법은 무엇입니까?

그러나 필드를 유연하게 만들지 못했습니다. 즉, 사용자가 4 열을 선택하면 작동하지만 1 열 또는 2 열 또는 3 열을 선택하면 필드 이름이 식별되지 않으므로 오류가 발생합니다.

fieldname에 대한 기본 표현식을 만들거나 for 루프/java 스크립트를 사용할 수있는 경우 긴급히 해결책을 게시하십시오.

게다가, 재 스퍼 디자이너는 어떻게 이것을 정확하게 수행 할 수 있습니까? 다음과 같이

jrxml은 다음과 같습니다 경우

<?xml version="1.0"?> 
<!DOCTYPE jasperReport 
    PUBLIC "-//JasperReports//DTD Report Design//EN" 
    "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> 
<jasperReport name="report1"> 
    <parameter name="reportTitle" class="java.lang.String"/> 
    <parameter name="author" class="java.lang.String"/> 
    <parameter name="startDate" class="java.lang.String"/> 

    <parameter name="C1" class="java.lang.String"> 
     <defaultValueExpression> 
      new java.lang.String("") 
     </defaultValueExpression> 
    </parameter> 
    <parameter name="C2" class="java.lang.String"> 
     <defaultValueExpression> 
      new java.lang.String("") 
     </defaultValueExpression> 
    </parameter> 
    <parameter name="C3" class="java.lang.String"> 
     <defaultValueExpression> 
      new java.lang.String("") 
     </defaultValueExpression> 
    </parameter> 
    <parameter name="C4" class="java.lang.String"> 
     <defaultValueExpression> 
      new java.lang.String("default parameter value") 
     </defaultValueExpression> 
    </parameter> 

    <field name="COLUMN_1" class="java.lang.Integer"/> 
    <field name="COLUMN_2" class="java.lang.Integer"/> 
    <field name="COLUMN_3" class="java.lang.Integer"/> 
    <field name="COLUMN_4" class="java.lang.Integer"/> 

    <title> 
     <band height="60"> 
      <textField> 
       <reportElement x="0" y="10" width="500" height="40"/> 
       <textElement textAlignment="Center"> 
        <font size="24"/> 
       </textElement> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{reportTitle}]]> 
       </textFieldExpression> 
      </textField> 
      <textField> 
       <reportElement x="0" y="40" width="500" height="20"/> 
       <textElement textAlignment="Center"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA["Run by: " + $P{author} 
         + " on " + $P{startDate}]]> 
       </textFieldExpression> 
      </textField> 
     </band> 
    </title> 

    <columnHeader> 
     <band height="30"> 
      <rectangle> 
       <reportElement x="0" y="0" width="500" height="25"/> 
       <graphicElement/> 
      </rectangle> 

      <textField> 
       <reportElement x="0" y="5" width="170" height="15"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{C1}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="70" y="5" width="170" height="15"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{C2}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="150" y="5" width="150" height="15"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{C3}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="300" y="5" width="150" height="15"/> 
       <textFieldExpression class="java.lang.String"> 
        <![CDATA[$P{C4}]]> 
       </textFieldExpression> 
      </textField> 
     </band> 
    </columnHeader> 

    <detail> 
     <band height="20"> 
      <textField> 
       <reportElement x="5" y="0" width="50" height="15"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Integer"> 
        <![CDATA[$F{COLUMN_1}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="90" y="0" width="150" height="15"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Integer"> 
        <![CDATA[$F{COLUMN_2}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="170" y="0" width="50" height="15"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Integer"> 
        <![CDATA[$F{COLUMN_3}]]> 
       </textFieldExpression> 
      </textField> 

      <textField> 
       <reportElement x="320" y="0" width="150" height="15"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Integer"> 
        <![CDATA[$F{COLUMN_4}]]> 
       </textFieldExpression> 
      </textField> 
     </band> 
    </detail> 
</jasperReport> 

답변

1

는 당신이 숨어 동적되고 싶어/새 필드를 보여, 내가 유일한 방법은 런타임에 당신의 jrxml을 수정하고 컴파일하는 것입니다 생각합니다.

UPDATE :

당신이 세 가지 방법이 런타임에이 JasperReport의 동적를 만들려면 :

1. 보고서가 복잡하고 많은 하위 보고서와 하위 데이터가있는 경우의 iReport
에 JRXML 만들기, iReport는 나중에 설계하고 유지하는 것이 더 빠르고 쉽습니다.
이 방법을 사용하면 jrxml 파일을 만들고 클래스 경로에 저장합니다. 런타임에이 파일을로드하고 열고 XML 태그를 수정합니다. 최대 열 수를 포함하는 jrxml로 시작하는 것이 좋습니다. 그리고 사용자가 더 적은 수의 열을 선택한 다음 jrxml에서 해당 열을 찾아 삭제하십시오. 보고서는 정말 간단 경우

2. 빠른 테이블 보고서처럼,
이 방법은 더 나은 자바에서 전체 보고서를 만들기 당신이 jrxml 파일을 필요 없어요이 경우, 당신은 런타임에 전체 보고서를 만들 수 있습니다 JasperReport 라이브러리 API를 사용하여 처음부터. 이 방법을 사용하면 컴파일하고 실행할 때까지 아무 것도 볼 수 없으므로 보고서를 더 세게 디자인 할 수 있습니다. 그러나 유지 보수의 악몽은 더 심합니다.
귀하의 최종 Java 소스 코드는 다음과 같이 보일 것이다 : 당신이 새로운 도구에 열려있는 경우,
마지막으로 "Fixed Column Width Test"1

3. DynamicJasper을, 당신은 online demo 등을 확인할 수 있습니다 항상 DynamicJasper있다 잘, 그 매우 시원한.
나는 모든 접근법을 보여주기 위해 끝까지 DJ 해왔다. DJ는 실제로 두 번째 것을 사용한다. 즉석에서 보고서의 Java 소스 코드 작성.


1 : 고정 열 너비 시험 보고서의 저작권 DynamicJasper위한 단지 샘플로 여기에 사용.

+0

그래,하지만 그게 내 질문 이었어 그것을 수정하는 방법 알아요? 그것에 대해 생각해? – Sundhas

+1

감사합니다 medopal 나는 새로운 도구에 개방적이지만 문제는 DJ가 어떻게 프런트 엔드에서 DJ로 동적으로 속성을 보내고 싶어하지만 내가 어떻게 알아낼 수 없다는 것입니다. 그게 뭔지 모르겠군요 ... 적 DJ 사용? – Sundhas

+0

꽤 사용하기 쉽고, 다운로드 DJ, Getting Started 가이드로 가서 처음 보고서를 쉽게 만들 수 있습니다. 그리고 예, 프런트 엔드 속성에서 동적으로 보고서를 만들 수 있다는 것을 확신합니다. 정확히 왜 DJ가 만들어 졌나요? – medopal

관련 문제