2012-06-22

第一個 JasperReports Sample with Java - JREmptyDataSource

建立 Eclipe project
mvn archetype:create -DgroupId=idv.neil.jr622 -DartifactId=jr622
cd jr622
mvn eclipse:eclipse
開啟 pom.xml,加上 JasperReports Dependency
<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>4.6.0</version>
</dependency>
再加上 downloadSources
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <configuration>
                <!-- 讓產生的 .classpath 包含 source jar -->
                <downloadSources>true</downloadSources>
            </configuration>
        </plugin>
    </plugins>
</build>
再執行一次 mvn eclipse:eclipse,第一次執行需要一些時間下載一堆 library。


完成後,重新整理 Eclipse Project。

建立 Java class
public class HelloJasper {

    public static void main(String[] args) {
        // 先用 iReport 套用 Template 做出一個 Jasper 檔來
        // iReport 預設產生 XML 檔,在預覽過後,在 XML 所在目錄就會產出 Jasper 檔
        String jsFile = "D:/_Download/report3.jasper";
        String outFile = "D:/_Download/report3.pdf";
        try {
            // 使用神奇的 JREmptyDataSource
            JasperPrint print = JasperFillManager.fillReport(jsFile, new HashMap(), new JREmptyDataSource());
            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFile);
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
            exporter.exportReport();
        }
        catch (JRException e) {
            e.printStackTrace();
        }
    }
}
JasperReports 提供一個方便的測試 class:JREmptyDataSource,免設 DataSource,可用來檢測版面設計是否正確。

執行如果出現「java.lang.NoClassDefFoundError: org/mozilla/javascript/EvaluatorException」或者「java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException」,就是 JapserReport 使用的 Expression 語言設成 Javascript 或者 Groovy 了,可以到 iReport 檔案名稱按右鍵 > 屬性 > Language 改成 Java 就沒事了

也可以加上 Javascript 或者 Groovy 的 library。
<dependency>
    <groupId>rhino</groupId>
    <artifactId>js</artifactId>
    <version>1.7R1</version>
</dependency>
<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>1.7.5</version>
</dependency>
過程中發現一件有趣的事,就是在 Eclipse Workspace 裡恰好有下載來的  jasperreports project,在對 Sample project 執行 mvn eclipse:eclipse 時,居然不是循往例從 M2_REPO 裡取用 JasperReports library,而是用 Eclipse Project Reference,如下圖:


經過往返測試,發現 Maven 是判斷 jasperreports Project 裡的 pom.xml,若符合需求則會拉進來用,即使該 Project 是關閉的。


沒有留言:

張貼留言