Sharing is caring!

โปรเจคเกือบจะทุกระบบที่พัฒนาขึ้นมาจำเป็นต้องมองหาระบบออกรายงาน เพื่อดูรูปแบบมิติของข้อมูลในมุมมองต่าง ๆ และรูปแบบชนิดของไฟล์หลากหลายชนิด เช่น PDF , XLS ,HTML , DOCX ,PPTX , CSV , TEXT , XML เป็นต้น ถ้าความต้องการของลูกค้าอยากจะได้ทุกชนิดละคงต้องประเมินเวลาไปอย่างน้อย 1 เดือนสำหรับการที่ทำ Report ให้ออกมาตามประเภทไฟล์ข้างต้นนี้ทั้งหมด แต่ลูกค้าที่น่ารักใจร้อนอยากจะได้เร็ว ๆ ให้เวลาช้าที่สุด 1 สัปดาห์ได้ไหม บทความนี้ช่วยคุณแก้ปัญหานี้ได้แน่นอน

สำหรับบทความนี้ก็เหมาะสำหรับนักพัฒนาที่มีพื้นฐาน Java สักหน่อย เริ่มกันเลย

    1. สร้าง Maven Project ขึ้นมา (จะเป็น Java Web หรือ Java Application ก็แล้วแต่ลักษณะงานของคุณ)
    2. เพิ่ม .pom ตามนี้
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>com.poolsawat</groupId>
          <artifactId>MyDynamicReport</artifactId>
          <version>1.0-SNAPSHOT</version>
          <packaging>jar</packaging>
          <properties>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <maven.compiler.source>1.7</maven.compiler.source>
              <maven.compiler.target>1.7</maven.compiler.target>
              
              <slf4j.version>1.7.7</slf4j.version>
              
              <jasperreports.version>6.3.1</jasperreports.version>
              <dynamicreport.version>5.0.0</dynamicreport.version>
              <groovy.version>1.8.6</groovy.version>
              <poi.version>3.10.1</poi.version>
              
          </properties>
          <dependencies>        
      
              <dependency>
                  <groupId>org.codehaus.groovy</groupId>
                  <artifactId>groovy-all</artifactId>
                  <version>${groovy.version}</version>
              </dependency>        
              <dependency>
                  <groupId>net.sourceforge.dynamicreports</groupId>
                  <artifactId>dynamicreports-core</artifactId>
                  <version>${dynamicreport.version}</version>
              </dependency>        
              <dependency>
                  <groupId>net.sf.jasperreports</groupId>
                  <artifactId>jasperreports</artifactId>
                  <version>${jasperreports.version}</version>
                  <exclusions>
                      <exclusion>
                          <groupId>commons-logging</groupId>
                          <artifactId>commons-logging</artifactId>
                      </exclusion>
                  </exclusions>
              </dependency>
              
              <!--Poi-->
              <dependency>
                  <groupId>org.apache.poi</groupId>
                  <artifactId>poi</artifactId>
                  <version>${poi.version}</version>
              </dependency>
              
              
              <!-- Logging -->
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-api</artifactId>
                  <version>${slf4j.version}</version>
                  <scope>compile</scope>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-log4j12</artifactId>
                  <version>${slf4j.version}</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
              <dependency>
                  <groupId>commons-logging</groupId>
                  <artifactId>commons-logging</artifactId>
                  <version>1.2</version>
              </dependency>
      
          </dependencies>
      </project>




  1. สร้าง GenarateReport.java
    package com.poolsawat.dynamic;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.util.Date;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import static net.sf.dynamicreports.report.builder.DynamicReports.*;
    import net.sf.dynamicreports.report.builder.style.StyleBuilder;
    import net.sf.dynamicreports.report.constant.HorizontalTextAlignment;
    import net.sf.dynamicreports.report.datasource.DRDataSource;
    import net.sf.dynamicreports.report.exception.DRException;
    import net.sf.jasperreports.engine.JRDataSource;
    
    /**
     *
     * @author poola410
     */
    public class GenarateReport {
    
        public GenarateReport() {
            build();
        }
    
        private void build() {
            try {
                report()//create new report design
                        //.setDefaultFont(stl.font().setFontName("TH SarabunPSK").setFontSize(16))                    
                        .columns(
                                col.column("PostId", "id", type.integerType())
                                        .setStyle(getTableStyle())
                                        .setTitleStyle(getTableStyle()),
                                col.column("PostTitle", "title", type.stringType())
                                        .setStyle(getTableStyle())
                                        .setTitleStyle(getTableStyle()),
                                col.column("PostAuthor", "author", type.stringType())
                                        .setStyle(getTableStyle())
                                        .setTitleStyle(getTableStyle()),
                                col.column("PostPublicDate", "public_date", type.dateType())
                                        .setStyle(getTableStyle())
                                        .setTitleStyle(getTableStyle()))
                        .title(cmp.text("PoolsawatBlogs"))//shows report title
                        .pageFooter(cmp.pageXofY())//shows number of page at page footer
                        .setDataSource(createDataSource())//set datasource
                        //.show();//create and show report
                        .toPdf(new FileOutputStream(new File("./src/main/resources/output/poolsawat.pdf")))
                        .toXls(new FileOutputStream(new File("./src/main/resources/output/poolsawat.xls")))
                        .toCsv(new FileOutputStream(new File("./src/main/resources/output/poolsawat.csv")))
                        .toXlsx(new FileOutputStream(new File("./src/main/resources/output/poolsawat.xlsx")))
                        .toHtml(new FileOutputStream(new File("./src/main/resources/output/poolsawat.html")))
                        .toPptx(new FileOutputStream(new File("./src/main/resources/output/poolsawat.pptx")))
                        .toText(new FileOutputStream(new File("./src/main/resources/output/poolsawat.text")))
                        .toXml(new FileOutputStream(new File("./src/main/resources/output/poolsawat.xml")));
                        
            } catch (DRException e) {
                e.printStackTrace();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(GenarateReport.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        private StyleBuilder getTableStyle(){
            return stl.style().setBorder(stl.border(stl.pen1Point()))
                    .setHorizontalTextAlignment(HorizontalTextAlignment.LEFT);
        }
    
        private JRDataSource createDataSource() {
            DRDataSource dataSource = new DRDataSource("id", "title","author","public_date");
            dataSource.add(1215,"Quartz Scheduler มันคืออะไร การใช้งานเบื้องต้น", "admin", new Date());
            dataSource.add(1150,"Gson Open Source Library สำหรับจัดการ JSON Formatter", "admin", new Date());
            dataSource.add(1132,"สร้าง Spring MVC 4 ร่วมกับ Apache Tiles 3", "admin", new Date());
            dataSource.add(1099,"[ES6] Promise คืออะไร", "admin", new Date());
            dataSource.add(1072,"ประสบการณ์ทำเว็บไซต์ให้ปลอดภัยด้วย HTTPS ไม่ยากอย่างที่คิด", "admin", new Date());
            dataSource.add(1025,"เล่าประสบการณ์แข่งขัน Hackathon ครั้งแรกให้ชีวิต", "admin", new Date());
            dataSource.add(1002,"สรุปสิ่งที่ได้รับจากงาน Cloud Functions for Firebase and Next Generation of Web", "admin", new Date());
            return dataSource;
        }
    
        public static void main(String[] args) {
            new GenarateReport();
        }
    }
    
  2. สั่ง RUN File GenarateReport.java
  3. ดู output ตาม Path

 DynamicReport สามารถทำ Report ที่แสดงในรูปแบบของกราฟได้ด้วย ศึกษาเพิ่มเติมจากลิ้งนี้

Github source ZIP , Github Source Repository