1. 程式人生 > >純JAVA程式碼利用DynamicReports外掛生成動態報表

純JAVA程式碼利用DynamicReports外掛生成動態報表

1.首先,我的目的是純java專案連線SQL2008資料庫,之後能夠應客戶需要打印出使用者的近期10次的消費回單。

2.昨天想到用ireport+jasperreports生成報表,發現生成的是靜態的報表,不具有實時性,不能滿足要求。

3.今天看到jasperreports外掛DynamicReports可以動態生成.pdf格式的報表,於是開始艱辛的探索:

(1)準備工作:

.去官網下載DynamicReports的包。我下載的好像是DynamicJasper-5.0.4-bundle解壓之後裡面有5個DynamicJasper的.jar檔案。


.再去官網下載一個寫有例程的壓縮包,我是下載的dynamicreports-4.1.1-project-with-dependencies。裡面的\lib路徑裡面的許多.jar檔案很重要。


.再去下載一個jasperreports-6.3.0-project的壓縮包。解壓之後裡面的\dist路徑下有一個jasperreports-6.3.0(最新版本)的.jar檔案。

(2)開始開啟Eclipse新建一個JAVA工程。(注:前提是你要製作的表格的資料庫已經建好。欄位都已經無誤)。


(3)現在進行一個至關重要的步驟:給該工程新增準備的一系列.jar檔案。給工程新增包的步驟不在贅述,直接說新增哪些包:

DynamicJasper-5.0.4-bundle解壓之後裡面有5個DynamicJasper的.jar檔案;

jasperreports-6.3.0-project的壓縮包裡面的jasperreports-6.3.0.jar;

dynamicreports-4.1.1-project-with-dependencies。裡面的\lib路徑裡面的commons-collections-3.2.2.jar;

commons-digester-2.1.jar;commons-lang3-3.1.jar;commons-logging-1.1.1.jar;itext-2.1.7.js5.jar。

最後別忘了把你的SQL的驅動包載入到裡面。最後包含的包如圖所示:其中還有一個iTextAsian.jar包一會再說。

(4).貼上我的純java程式碼:僅供參考。(注:大部分copy的別人的,但是有一部分我自己修改了)。

package dynamicreports;

import java.awt.Color;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.swing.JFrame;
import net.sf.dynamicreports.jasper.builder.JasperReportBuilder;
import net.sf.dynamicreports.report.builder.DynamicReports;
import net.sf.dynamicreports.report.builder.column.Columns;
import net.sf.dynamicreports.report.builder.component.Components;
import net.sf.dynamicreports.report.builder.datatype.DataTypes;
import net.sf.dynamicreports.report.builder.style.StyleBuilder;
import net.sf.dynamicreports.report.constant.HorizontalAlignment;
import net.sf.dynamicreports.report.constant.PageType;
import net.sf.dynamicreports.report.exception.DRException;

import com.lowagie.text.pdf.BaseFont;
/**
 * 
 * @ClassName: Reports
 * @Description: 列印動態pdf報表
 * @author: Administrator
 * @date: 2016年12月30日 下午8:01:09
 */
public class Reports{
	
	public static Connection getConn() throws ClassNotFoundException, SQLException{
		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
		return(Connection) DriverManager.getConnection("jdbc:sqlserver://localhost:1433; DatabaseName=CardManagementSystem", "Sa", "Wang89918157");
	}
	
	@SuppressWarnings("deprecation")
	public static void buildReport(Connection conn,String sqlString){
		JasperReportBuilder report=DynamicReports.report();//建立空報表
		//設定報表的一系列樣式 ,stl是建立和自定義風格的一組方法
		StyleBuilder boldStl=DynamicReports.stl.style().bold();
		StyleBuilder boldCenteredStl=DynamicReports.stl.style(boldStl).setHorizontalAlignment(HorizontalAlignment.CENTER);;
		StyleBuilder titleStl=DynamicReports.stl.style(boldCenteredStl).setFontSize(16);
		StyleBuilder columnTitleStl=DynamicReports.stl.style(boldCenteredStl).setBorder(DynamicReports.stl.pen1Point())
				.setBackgroundColor(Color.LIGHT_GRAY);//設定列名欄的背景顏色為灰色
		
		StyleBuilder fontStyleBuilder = DynamicReports.stl.style().setPadding(2)
				.setPdfFontName("STSong-Light")
				.setPdfEncoding("UniGB-UCS2-H")
				.setPdfEmbedded(BaseFont.NOT_EMBEDDED);
		
		columnTitleStl.setPdfFontName("STSong-Light")
		.setPdfEncoding("UniGB-UCS2-H")
		.setPdfEmbedded(BaseFont.NOT_EMBEDDED);
		
		titleStl.setPdfFontName("STSong-Light")
		.setPdfEncoding("UniGB-UCS2-H")
		.setPdfEmbedded(BaseFont.NOT_EMBEDDED);
		
		report.setPageFormat(PageType.A5); //設定每一頁的格式
		
		report.columns(Columns.column("操作日期", "OperateTime", DataTypes.stringType()).setHorizontalAlignment(HorizontalAlignment.CENTER),
        Columns.column("使用者姓名", "CustomerName", DataTypes.stringType()).setHorizontalAlignment(HorizontalAlignment.CENTER),
        Columns.column("扣錢", "Deductmoney", DataTypes.stringType()).setHorizontalAlignment(HorizontalAlignment.CENTER),
        Columns.column("存錢", "Savemoney", DataTypes.stringType()).setHorizontalAlignment(HorizontalAlignment.CENTER),
        Columns.column("使用者ID", "CustomerID", DataTypes.stringType()).setHorizontalAlignment(HorizontalAlignment.CENTER),
        Columns.column("餘額", "CustomerMoney", DataTypes.stringType()).setHorizontalAlignment(HorizontalAlignment.CENTER))
        	  .setColumnStyle(fontStyleBuilder)   //查詢的資料的字型格式
			  .setColumnTitleStyle(columnTitleStl) //設定列名的風格
			  .setHighlightDetailEvenRows(true)  //偶數行高亮顯示
			  .title(Components.text("客戶消費單").setStyle(titleStl))//標題
			  .pageFooter(Components.pageXofY().setStyle(boldCenteredStl))//頁角
			  .setDataSource("SELECT * FROM ReportMessage WHERE OperateTimeCustomerID = '"+sqlString+"'", conn);//資料來源
		try {
			//顯示報表
			report.show(false);  //關閉預覽視窗後不退出程式
			try {
				FileOutputStream fileOutputStream = new FileOutputStream("D:/test.pdf");//構建一個pdf存放的輸出位置
				report.toPdf(fileOutputStream);//列印的pdf地址
				try {
					fileOutputStream.flush();  //保證pdf輸出完畢
					fileOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (DRException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

(5)最後說一下的顯示中文的時候的必須需要的兩個.jar檔案。一個是itext-2.1.7.js5.jar;還有一個是iTextAsian.jar檔案。而且我輸出的就是一個消費單表格,如果需要其他的報表功能,你需要新增你需要的另外一些.jar檔案。

(6)我的pdf檔案:

還有許多需要美化的地方。。。。水平就只能到這了。附上一些連結:

http://blog.csdn.net/qiuhan/article/details/42558811

http://download.csdn.net/download/ssxueyi/4659874  

http://hepx.iteye.com/blog/1880534   

這是我的畢業設計涉及到的一部分,想了解更多關於這個專案的資料,可以去我的github,有關於這個小專案的上位機和下位機的所有資料,附上鍊接:TeslaHua的Github