โปรเจคเกือบจะทุกระบบที่พัฒนาขึ้นมาจำเป็นต้องมองหาระบบออกรายงาน เพื่อดูรูปแบบมิติของข้อมูลในมุมมองต่าง ๆ และรูปแบบชนิดของไฟล์หลากหลายชนิด เช่น PDF , XLS ,HTML , DOCX ,PPTX , CSV , TEXT , XML เป็นต้น ถ้าความต้องการของลูกค้าอยากจะได้ทุกชนิดละคงต้องประเมินเวลาไปอย่างน้อย 1 เดือนสำหรับการที่ทำ Report ให้ออกมาตามประเภทไฟล์ข้างต้นนี้ทั้งหมด แต่ลูกค้าที่น่ารักใจร้อนอยากจะได้เร็ว ๆ ให้เวลาช้าที่สุด 1 สัปดาห์ได้ไหม บทความนี้ช่วยคุณแก้ปัญหานี้ได้แน่นอน
สำหรับบทความนี้ก็เหมาะสำหรับนักพัฒนาที่มีพื้นฐาน Java สักหน่อย เริ่มกันเลย
-
- สร้าง Maven Project ขึ้นมา (จะเป็น Java Web หรือ Java Application ก็แล้วแต่ลักษณะงานของคุณ)
- เพิ่ม .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>
- สร้าง 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(); } }
- สั่ง RUN File GenarateReport.java
- ดู output ตาม Path
DynamicReport สามารถทำ Report ที่แสดงในรูปแบบของกราฟได้ด้วย ศึกษาเพิ่มเติมจากลิ้งนี้