2012-07-18 7 views
13

JRBeanCollectionDataSource를 사용하여 Jasper 보고서 (PDF, Excel, Csv)를 만들면 좋습니다. 이것은 .jrxml 파일이 보고서를 처리하기위한 입력으로 pojo 콜렉션을 승인한다는 것을 의미합니다.JSON 개체 또는 JSON 문자열에서 Jasper 보고서 PDF 양식 만들기

이제 저는 JSON 개체에서 동일한 .jrxml을 사용하여 벽면 보고서를 만들려고했습니다. 나는 다음을 시도했지만 모든 값은 PDF 보고서

Resource resource = new ClassPathXmlApplicationContext().getResource("classpath:reports/project.jrxml"); 
JsonDataSource ds = new JsonDataSource(new File("c:\myjson.json")); 
jasperDesign = JRXmlLoader.load(resource.getInputStream()); 
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds); 
JasperExportManager.exportReportToPdfFile(jasperPrint, destination+fileName+".pdf"); 

중 하나가 나를 도울 수에 null이?

+0

이 작업을 수행 했습니까? 나는 지금 같은 일을 시도하고있다. – Marianna

답변

18

나는 JSDON을 Jasper Report의 DataSource로 사용하는 데 어려움을 겪었으며, Net에 적절한 예제가 없기 때문에 나중에 참조 할 수 있도록 여기에 게시 할 것이라고 생각했습니다.

이 예제는 iReport Designer와 JSON DataSource를 사용하는 방법입니다.

첫째, 입력 JSON :

{ 
    "userName": "Evil Raat", 
    "details": { 
     "email": "[email protected]" 
    } 
} 

는 다음의 iReport 디자이너에서 JSON 데이터 소스를 작성하고

다음 사용자가 사용할 수 있습니다 (기본값으로 다른 모든 세부 사항을두고) 파일에 그것을 가리 킵니다

<?xml version="1.0" encoding="UTF-8"?> 
<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="sample" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a894078a-929b-4aae-a1d0-46485f0f8835"> 
    <property name="ireport.zoom" value="1.0"/> 
    <property name="ireport.x" value="0"/> 
    <property name="ireport.y" value="0"/> 
    <queryString language="json"> 
     <![CDATA[]]> 
    </queryString> 
    <field name="userName" class="java.lang.String"> 
     <fieldDescription><![CDATA[userName]]></fieldDescription> 
    </field> 
    <field name="userEmail" class="java.lang.String"> 
     <fieldDescription><![CDATA[details.email]]></fieldDescription> 
    </field> 
    <title> 
     <band height="200" splitType="Stretch"> 
      <textField> 
       <reportElement uuid="3b74775b-4555-43c3-bdf2-1677145c8660" x="0" y="31" width="555" height="20"/> 
       <textElement textAlignment="Right"> 
        <font fontName="Helvetica" size="12" isBold="true"/> 
       </textElement> 
       <textFieldExpression><![CDATA[$F{userName}]]></textFieldExpression> 
      </textField> 
      <textField> 
       <reportElement uuid="aa6cc7c8-2ca1-4f0f-92e2-c466083daba0" x="0" y="54" width="555" height="20"/> 
       <textElement textAlignment="Right"> 
        <font fontName="Helvetica" size="12" isBold="true"/> 
       </textElement> 
       <textFieldExpression><![CDATA[$F{userEmail}]]></textFieldExpression> 
      </textField> 
     </band> 
    </title> 
</jasperReport> 

참고 : jrxml 템플릿을 다음은 보고서에 위의 JSON 렌더링하기 당신은을 정의해야합니다 필드 요소를 먼저 사용할 수 있습니다. 표준 점 표기법을 사용하여 JSON 입력 파일의 루트에서 JSON 경로 여야합니다. 예제는 위의 fieldDescription 요소를 참조하십시오. 어떤 사람들은 도움이

희망 : 당신의 필드가 당신이 계산 텍스트 필드의 값이든 사용할 수 있습니다 정의되면

.

+2

객체 배열은 어떨까? 당신은 어떻게 그들을 다루십니까? 특히 세부 밴드에 그들을 배치? – Yebach

+0

죄송합니다. 나는이 게시물 이후 얼마 지나지 않아 Jasper Reports와의 작업을 중단 했으므로 잘 모릅니다. –

1

이 내가

나는 다음과 같은 배열을보고 할 말을 수 있습니다 재스퍼에서 JSON 배열을 처리하는 방법입니다.

[ 
    {"name":"Jerry", "value":"Jesus"}, 
    {"name":"Gideon", "value": "Loves"}, 
    {"name":"Eva", "value": "You"} 
] 

보고서를 디자인 할 때 필드의 이름을 json 필드 이름과 완전히 동일하게 지정해야합니다. 디자이너에서 나는 이라는 이름의을 추가 할 것입니다. 필요에 따라 보고서 디자이너에 많은 매개 변수를 추가 할 수도 있습니다. 이 예제에서는 Jasper Studio에 이라는 제목 인이라는 매개 변수를 추가하겠습니다.

이제이 테스트 배열을 기반으로 벽옥 보고서를 작성하는 Java 코드가 있습니다. 코드에서 json 데이터를 하드 코딩 하겠지만, 파일이나 무엇이든 가장 좋은 것으로부터로드 할 수 있습니다. 나는 무슨 일이 일어나고 있는지 설명하기 위해 코드에 주석을 달았다. https://mis.io/pub/how-to-create-a-jasper-pdf-report-from-a-json-datasource-in-java/

import net.sf.jasperreports.engine.export.JRHtmlExporterParameter; 
import net.sf.jasperreports.engine.export.JRXlsExporterParameter; 
import net.sf.jasperreports.engine.export.JRHtmlExporter; 
import net.sf.jasperreports.engine.export.JRXlsExporter; 
import net.sf.jasperreports.engine.data.JsonDataSource; 
import net.sf.jasperreports.engine.JRExporterParameter; 
import net.sf.jasperreports.engine.JasperExportManager; 
import net.sf.jasperreports.engine.JasperFillManager; 
import net.sf.jasperreports.engine.util.JRLoader; 
import net.sf.jasperreports.engine.JasperReport; 
import net.sf.jasperreports.engine.JRException; 
import net.sf.jasperreports.engine.JasperPrint; 
import org.apache.commons.codec.binary.Base64; 
import java.util.HashMap; 
import java.util.Locale; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.io.*; 

//Class Name. This must match the class name you put in your build.gradle file 
public class JasperPDFExample { 
public static void main(String[] args) { 
    try { 
    try { 
    //Our json object. This can be loaded from file 
    String rawJsonData = "[{\"name\":\"Jerry\", \"value\":\"Jesus\"}," 
         + "{\"name\":\"Gideon\", \"value\": \"Loves\"}," 
         + "{\"name\":\"Eva\", \"value\": \"You\"}" 
         + "]"; 
    //Load compiled jasper report that we created on first section. 
    JasperReport report = (JasperReport) JRLoader.loadObject(new File("/home/jerry/Sample.jasper")); 
    //Convert json string to byte array. 
    ByteArrayInputStream jsonDataStream = new ByteArrayInputStream(rawJsonData.getBytes()); 
    //Create json datasource from json stream 
    JsonDataSource ds = new JsonDataSource(jsonDataStream); 
    //Create HashMap to add report parameters 
    Map parameters = new HashMap(); 
    //Add title parameter. Make sure the key is same name as what you named the parameter in jasper report. 
    parameters.put("title", "Jasper PDF Example"); 
    //Create Jasper Print object passing report, parameter json data source. 
    JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters, ds); 
    //Export and save pdf to file 
    JasperExportManager.exportReportToPdfFile(jasperPrint,"/home/jerry/jasperpdfexample.pdf"); 
    } catch (JRException ex) { 
    ex.printStackTrace(); 
    throw new RuntimeException(ex); 
    } catch (Exception ex) { 
    ex.printStackTrace(); 
    throw new RuntimeException(ex); 
    } 
    } catch (Exception ex) { 
    ex.printStackTrace(); 
    throw new RuntimeException(ex); 
    } 
} 
} 

덕분에 나는이 Gradle을 빌드 도구를 사용하여 벽옥을위한 자바 설정과 함께 작동시킬 수 있었다.