본문 바로가기
프로그램 (PHP,Python)

오픈소스 리포팅 툴 (iReport)

by 날으는물고기 2009. 7. 2.

오픈소스 리포팅 툴 (iReport)

jasperreport 를 사용하기 위해서 .jar파일을 다운받아서 lib 폴더에 추가 하여야한다.

http://sourceforge.net/projects/jasperreports 사이트에서 다운받을수 있다.

필요한 파일은
struts2-jasperreports-plugin-2.x.x.jar
jasperreports.jar
commons-collections.jar
commons-digester.jar
commons-javaflow.jar
itext.jar
jdt-compiler.jar 

버전은 알아서 받기 바란다.

우선 PDF 파일로 변경하기 위해서 .jrxml파일이 필요하다.

<?xml version="1.0" encoding="UTF-8"  ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "
http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="book_list_template" >
    <field name="isbn" class="java.lang.String"/>
    <field name="title" class="java.lang.String"/>
    <field name="author" class="java.lang.String"/>

    <title>
        <band height="70">
            <staticText>
                 <reportElement x="230" y="9" width="180" height="32"/>
                 <textElement><font size="20"/></textElement>
                 <text><![CDATA[BOOK LIST]]></text>
            </staticText>
            <line direction="TopDown">
                <reportElement x="4" y="40" width="548" height="0" />
                <graphicElement stretchType="NoStretch"/>
            </line>
        </band>
    </title>

    <columnHeader>
        <band height="37" isSplitAllowed="true" >
            <staticText>
                <reportElement x="100" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[ISBN]]></text>
            </staticText>
            <staticText>
                <reportElement x="250" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[TITLE]]></text>
            </staticText>
            <staticText>
                <reportElement x="400" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[AUTHOR]]></text>
            </staticText>  
        </band>
    </columnHeader>

    <detail>
        <band height="20">
            <textField>
                <reportElement x="100" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{isbn}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="250" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{title}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="400" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{author}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

위와같은 .jrxml 파일을 생성한다.

    <field name="isbn" class="java.lang.String"/>
    <field name="title" class="java.lang.String"/>
    <field name="author" class="java.lang.String"/>

데이터 변수를 미리 정의한 부분이다. 사용될 변수이다.

<title>
        <band height="70">
            <staticText>
                 <reportElement x="230" y="9" width="180" height="32"/>
                 <textElement><font size="20"/></textElement>
                 <text><![CDATA[BOOK LIST]]></text>
            </staticText>
            <line direction="TopDown">
                <reportElement x="4" y="40" width="548" height="0" />
                <graphicElement stretchType="NoStretch"/>
            </line>
        </band>
    </title>

타이틀부분으로 상단에 한번만 출력 될부분이다.

<columnHeader>
        <band height="37" isSplitAllowed="true" >
            <staticText>
                <reportElement x="100" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[ISBN]]></text>
            </staticText>
            <staticText>
                <reportElement x="250" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[TITLE]]></text>
            </staticText>
            <staticText>
                <reportElement x="400" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[AUTHOR]]></text>
            </staticText>  
        </band>
    </columnHeader>

컬럼의 헤드를 표시하는 부분으로 역시 한번만 출력된다.

<text><![CDATA[AUTHOR]]></text>

이부분의 데이터가 출력된다.

<detail>
        <band height="20">
            <textField>
                <reportElement x="100" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{isbn}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="250" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{title}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="400" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{author}]]></textFieldExpression>
            </textField>
        </band>
    </detail>


데이터가 들어 있는만큼 루프가 되면서 데이터가 출력이된다.

<textFieldExpression><![CDATA[$F{author}]]></textFieldExpression>

상단에서 정의한 변수를 정의 하면된다.

<![CDATA[AUTHOR]]>  정적으로 글자를 출력할때 사용된다.

<![CDATA[$F{author}]]>  동적으로 데이터가 출렬될때 사용된다.

.jrxml 파일을 그냥 만들려면 xml을 모르는 나로써는 너무 힘든 작업이다.
이럴 위해서 iReport 툴이 있다 이것을 사용해서 작업을 하면 훨씬 쉽고 편하게 작업을 할수 있다.

http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/i/ir/ireport/

위의 사이트에서 다운로드 할수 있다.

iReport-nb-3.1.3-windows-installer.exe  

저는 위의 버전을 사용하였다. 

위와 같이 사용을 하면된다.. 우측상단에서 메뉴를 선택하여 드래그 하여서 사용하면된다.
혹시 데이터 중에 한글이 들어가게 되면 미리 보기를 하고 나면 에러 메시지를 볼수 있다.

그럴경우에는

<?xml version="1.0" encoding="UTF-8"?>

부분을

<?xml version="1.0" encoding="euc-kr"?>

로 변경하면 에러메시지는 사라 질것이다.


기본적으로 sturts2가 설정이 되어있다고 가정하고 설명을 하겠다. 

struts2 설정

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="jasper" namespace="/" extends="jasperreports-default,struts-default">

 <result-types>
  <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult" />
  <result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult" />
 </result-types>

 <action name="jasper" class="jasper" method="jaspertsTest">
  <result type="jasper">
   <param name="location">jrxml/jseper.jasper</param>
   <param name="dataSource">jasperBean</param>
  </result>

</package>

jasper를 사용하기 위해서는 관련 .jar파일이 필요하다 앞의 글을 참조하기 바란다.

<package name="jasper" namespace="/" extends="jasperreports-default,struts-default">

기본 적으로 struts-default를 참조하는데 여기서 jasperreports-defalut 를 추가 해준다

 <result-types>
  <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult" />
  <result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult" />
 </result-types>

여기서는 타입을 설정하는거 같은데 여기는 확실하게 이해가 안되어있어서..패스~~!!!

  <result type="jasper">
   <param name="location">jrxml/jseper.jasper</param>
   <param name="dataSource">jasperBean</param>
  </result>

결과를 출력하기 위한 부분이다

  <result type="jasper">

타입을 설정해준다.

   <param name="location">jrxml/jseper.jasper</param>

자바를 몰라서 많이 고생했든 부분이다.

.jasper 파일 이클립스내에서 컴파일을 해준다 사용자가 직접만드는 파일이 아니다.

.jrxml을 이클립스에 읽어들여서 컴파일 해주는걸로 알고 있는데 자세히는 모르겠다.

   <param name="dataSource">jasperBean</param>

action에서 정의한 변수명이된다.

액션파일

import domain.JasperBean;

public class jasper extends ActionSupport {

 private static final String REPORT_XML_FILE        = "D:/jrxml/infoTotal.jrxml";
 private static final String REPORT_COMPILE_FILE    = "D:/jrxml/infoTotal.jasper";

 private JasperBean    jasperBean;

 public String jaspertsTest() throws Exception{
  jasperBean = infoManager.pdfTotal(regnum);
  JasperCompileManager.compileReportToFile(REPORT_XML_FILE,REPORT_COMPILE_FILE);
  return SUCCESS;
 }

}

 public Pdf getJasperBean() {
  return jasperBean;
 }

 public void setJasperBean(JasperBean jasperBean) {
  this.jasperBean= jasperBean;
 }

 private static final String REPORT_XML_FILE        = "D:/jrxml/infoTotal.jrxml";

.jrxml 파일 위치를 설정한다..절대경로 해줬다..이방법 말고다른방법이 있을것도 같은데 

일단 나는 저렇게 했다.
 private static final String REPORT_COMPILE_FILE    = "D:/jrxml/infoTotal.jasper";

.jasper 파일은 첨에는 없다..이부분은 어디로 저장을 할껀지 저장위치를 와 파일명을 설정하는거같다.

도메인

public class JasperBean    {
 
 private String name;    
 private String email;   

 private String age;  

 public String getName() {
  return name;
 }
 public void setName(String regnum) {
  this.name= name;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email= email;
 }
 public String getAge() {
  return age;
 }
 public void setAge(String age) {
  this.age = age;
 }

}

jrxml

<?xml version="1.0" encoding="UTF-8"  ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="book_list_template" >
    <field name="name" class="java.lang.String"/>
    <field name="email" class="java.lang.String"/>
    <field name="age" class="java.lang.String"/>

    <title>
        <band height="70">
            <staticText>
                 <reportElement x="230" y="9" width="180" height="32"/>
                 <textElement><font size="20"/></textElement>
                 <text><![CDATA[name]]></text>
            </staticText>
            <line direction="TopDown">
                <reportElement x="4" y="40" width="548" height="0" />
                <graphicElement stretchType="NoStretch"/>
            </line>
        </band>
    </title>

    <columnHeader>
        <band height="37" isSplitAllowed="true" >
            <staticText>
                <reportElement x="100" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[email]]></text>
            </staticText>
            <staticText>
                <reportElement x="250" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[age]]></text>
            </staticText>
            <staticText>
                <reportElement x="400" y="0" width="180" height="29" />
                <textElement><font size="15" isUnderline="true"/></textElement>
                    <text><![CDATA[AUTHOR]]></text>
            </staticText>  
        </band>
    </columnHeader>

    <detail>
        <band height="20">
            <textField>
                <reportElement x="100" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="250" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{email}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="400" y="0" width="180" height="15"/>
                <textFieldExpression><![CDATA[$F{age}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

jrxml 을 만든다..

pdf 변환을 하면 한글이 보이지 않는경우가 있다. 폰트가 맞지않아서 안보는 경우이다.

이럴때는 폰트를 변화해주어야한다.

<font size="12" pdfFontName="MALGUN.TTF" pdfEncoding="Identity-H" isPdfEmbedded="true"/>

나는 이렇게 일이다 선언을 해주었다.

pdfFontName="MALGUN.TTF" 

폰트의 경로도 폼함해서 선언을 해주어야한다.


출처 : http://blog.naver.com/kil0207

728x90

댓글