Report in java – Final


Currency data type – row highlighters – Conditional styles

Hôm nay mình kết thúc bài viết tạo report cơ bản trong java.

Currency data type

Làm thế nào để chúng ta thiết lập currency for 1000 => $1000 hay khi chugn1 ta muốn làm tròn đến chử số thứ 2 như thế nào 1234,22 ..v.v.v

Ở đây dừng lại mức cơ bản . Sau này khi chúng ta đi vào thực tế có thể sẻ gặp nhiều vấn đề hơn.

Chúng ta tao 1 class CurrencyType extends BigDecimalType như sau : Thể hiện giá trị có hình dạng sau $ 9,000.25

class CurrencyType extends BigDecimalType{
	private static final long serialVersionUID = 1L;
	@Override
	public String getPattern() {
		return "$ #,###.00";
	}
}

Làm cách nào để ứng dụng vào column để hiển thị loại trên.
Cách 1 : chúng ta thiết lập vào TextColumnBuilder và loại Generic phải cùng loại với currencyType

TextColumnBuilder<BigDecimal> unitPriceColumn = col.column("Unit Price", "unitprice", currencyType);

Cách 2 : Chúng ta thiết lập column khi chúng ta phát sinh từ column khác bằng method setDataType(your…type)

TextColumnBuilder<BigDecimal> priceColumn =
 unitPriceColumn.multiply(quantityColumn).setTitle("Price").setDataType(currencyType)

Kết quả ngắn cho hiển thị
d1

row highlighters

Phần này sẻ hướng dẫn chúng ta Highlight row  với điều kiện nào đó như thế nào:


ConditionalStyleBuilder condition1 = stl.conditionalStyle(cnd.greater(priceColumn, 400))
 .setBackgroundColor(new Color(210, 255, 210));
 ConditionalStyleBuilder condition2 = stl.conditionalStyle(cnd.smaller(priceColumn, 150))
 .setBackgroundColor(new Color(255,210,210));

Chúng ta có 2 điều kiện :
Condition 1 : Chúng ta sẻ highlight row nào có Price > 400 màu xanh lá cây sáng (210,255,210)
Condition 2 : Chúng ta sẻ highlight row nào có Price < 150 màu hồng sáng (255,210,210)

Để hiện thực điều này trong report chúng ta khai báo :

.detailRowHighlighters(condition1,condition2)

Kết quả ngắn sau khi run :

d1

Conditional styles

Ở đây hướng dẫn chúng ta làm thế nào để thiết lập style cho CELL mà thỏa điều kiện nào đó:


ConditionalStyleBuilder condition3 = stl.conditionalStyle(cnd.greater(priceColumn, 800))
    					.setBackgroundColor(new Color(0,190,0)).bold();
ConditionalStyleBuilder condition4 = stl.conditionalStyle(cnd.smaller(priceColumn, 100))
				.setBackgroundColor(new Color(190,0,0)).bold();

StyleBuilder priceStyle = stl.style().conditionalStyles(condition3,condition4);
priceColumn.setStyle(priceStyle);

Ở đây chúng ta có 2 điều kiện:

Condition3 : CELL của COLUMN Price có giá trị lớn hơn 800 sẻ highlight nó

Condition4 : CELL của COLUMN Price có giá trị nhỏ hơn 100 sẻ highlight nó

Để hiện thự 2 điều kiện này trên CELL của Column nào đó

chúng ta sẻ tạo ra 1 style của mình và set các điều kiện vào

StyleBuilder priceStyle = stl.style().conditionalStyles(condition3,condition4);

hiện thự nó trên column chung ta dùng : YOUR_COLUMN.setStyle(YOUR_STYLE)

Kết quả ngắn khi chạy:

d1

Code final:

package thaihoanghai.wordpress.com.demo;

import static net.sf.dynamicreports.report.builder.DynamicReports.cht;
import static net.sf.dynamicreports.report.builder.DynamicReports.cmp;
import static net.sf.dynamicreports.report.builder.DynamicReports.cnd;
import static net.sf.dynamicreports.report.builder.DynamicReports.col;
import static net.sf.dynamicreports.report.builder.DynamicReports.exp;
import static net.sf.dynamicreports.report.builder.DynamicReports.grid;
import static net.sf.dynamicreports.report.builder.DynamicReports.grp;
import static net.sf.dynamicreports.report.builder.DynamicReports.sbt;
import static net.sf.dynamicreports.report.builder.DynamicReports.stl;
import static net.sf.dynamicreports.report.builder.DynamicReports.type;

import java.awt.Color;
import java.io.FileOutputStream;
import java.math.BigDecimal;

import net.sf.dynamicreports.jasper.builder.JasperReportBuilder;
import net.sf.dynamicreports.report.builder.DynamicReports;
import net.sf.dynamicreports.report.builder.chart.Bar3DChartBuilder;
import net.sf.dynamicreports.report.builder.column.PercentageColumnBuilder;
import net.sf.dynamicreports.report.builder.column.TextColumnBuilder;
import net.sf.dynamicreports.report.builder.component.Components;
import net.sf.dynamicreports.report.builder.datatype.BigDecimalType;
import net.sf.dynamicreports.report.builder.group.ColumnGroupBuilder;
import net.sf.dynamicreports.report.builder.style.ConditionalStyleBuilder;
import net.sf.dynamicreports.report.builder.style.StyleBuilder;
import net.sf.dynamicreports.report.constant.HorizontalAlignment;
import net.sf.dynamicreports.report.constant.VerticalAlignment;

public class App
{
    public static void main( String[] args ) throws Exception
    {
    	CurrencyType currencyType = new CurrencyType();

    	// Create variables for work set style for border, background
    	StyleBuilder boldStyle = stl.style().bold();
    	StyleBuilder boldCenteredStyle  = stl.style(boldStyle).setHorizontalAlignment(HorizontalAlignment.CENTER);
    	StyleBuilder columnTitleStyle = stl.style(boldCenteredStyle)
    									   .setBorder(stl.pen1Point())
    									   .setBackgroundColor(new Color(255, 210, 210));
    	// create titleStyle
    	StyleBuilder titleStyle = stl.style(boldCenteredStyle).setVerticalAlignment(VerticalAlignment.MIDDLE).setFontSize(15);

    	TextColumnBuilder<String> itemColumn = col.column("Item", "item", type.stringType()).setStyle(boldStyle);
    	TextColumnBuilder<Integer> quantityColumn = col.column("Quantity", "quantity", type.integerType());
    	//<!-- ======================================New Code=======================================================
    	TextColumnBuilder<BigDecimal> unitPriceColumn = col.column("Unit Price", "unitprice", currencyType);
    	//<!-- =====================================================================================================
    	// price = unitPrice * quantity
    	TextColumnBuilder<BigDecimal> priceColumn =
    			unitPriceColumn.multiply(quantityColumn).setTitle("Price").setDataType(currencyType);
    	PercentageColumnBuilder pricePercColumn = col.percentageColumn("Price %", priceColumn);
    	TextColumnBuilder<Integer> rowNumberColumn = col.reportRowNumberColumn("No.")
    	.setFixedColumns(2)
    	.setHorizontalAlignment(HorizontalAlignment.CENTER);

    	Bar3DChartBuilder itemChart = cht.bar3DChart()
    			.setTitle("Sales by item")
    			.setCategory(itemColumn)
    			.addSerie(cht.serie(unitPriceColumn),cht.serie(priceColumn));

    	Bar3DChartBuilder itemChar2 = cht.bar3DChart()
    			.setTitle("Sales by item")
    			.setCategory(itemColumn)
    			.setUseSeriesAsCategory(true) // 1 building scheme compares all fields in serie
    			.addSerie(cht.serie(unitPriceColumn),cht.serie(priceColumn));

    	ColumnGroupBuilder itemGroup = grp.group(itemColumn);
    	itemGroup.setPrintSubtotalsWhenExpression(exp.printWhenGroupHasMoreThanOneRow(itemGroup));

    	//===============================New Code============================================
    	ConditionalStyleBuilder condition1 = stl.conditionalStyle(cnd.greater(priceColumn, 400))
    					.setBackgroundColor(new Color(210, 255, 210));
    	ConditionalStyleBuilder condition2 = stl.conditionalStyle(cnd.smaller(priceColumn, 150))
    					.setBackgroundColor(new Color(255,210,210));
    	ConditionalStyleBuilder condition3 = stl.conditionalStyle(cnd.greater(priceColumn, 800))
    					.setBackgroundColor(new Color(0,190,0)).bold();
    	ConditionalStyleBuilder condition4 = stl.conditionalStyle(cnd.smaller(priceColumn, 100))
				.setBackgroundColor(new Color(190,0,0)).bold();

    	StyleBuilder priceStyle = stl.style().conditionalStyles(condition3,condition4);
    	priceColumn.setStyle(priceStyle);
    	//===============================End=================================================

    	ConnectDB connect = new ConnectDB();
    	// Create new report design
		JasperReportBuilder report = DynamicReports.report();
		report
		.setColumnTitleStyle(columnTitleStyle)// set style for column title
		.setSubtotalStyle(boldStyle)
		.highlightDetailEvenRows() // high light for line even
		.columns(rowNumberColumn,itemColumn,quantityColumn,unitPriceColumn,priceColumn,pricePercColumn)
		.columnGrid(rowNumberColumn,quantityColumn,unitPriceColumn,grid.verticalColumnGridList(priceColumn,pricePercColumn))
		.groupBy(itemGroup)
		.subtotalsAtSummary(sbt.sum(unitPriceColumn),sbt.sum(priceColumn))
		.subtotalsAtFirstGroupFooter(sbt.sum(unitPriceColumn),sbt.sum(priceColumn))
		//===============================new code===================================================
		.detailRowHighlighters(condition1,condition2)
		//===============================end=======================================================
		.title(
				cmp.horizontalFlowList()
				.add(
						cmp.image("logo.png").setFixedDimension(100, 100),
						cmp.text("Simple Report").setStyle(titleStyle).setHorizontalAlignment(HorizontalAlignment.LEFT),
						cmp.text("List Product").setStyle(titleStyle).setHorizontalAlignment(HorizontalAlignment.RIGHT))
				.newRow()
				.add(cmp.filler().setStyle(stl.style().setTopBorder(stl.pen2Point())).setFixedHeight(10)))
		// Set position for title
		.pageFooter(Components.pageXofY().setStyle(boldCenteredStyle)) // show number of page at page footer
		.summary(cmp.horizontalFlowList(itemChart,itemChar2))
		// set datasource with specific query from database
		.setDataSource("select id, item, quantity, unitprice from product",connect.openConnect());

		try {
			report.show();
			report.toPdf(new FileOutputStream("d:/report.pdf"));
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

}
class CurrencyType extends BigDecimalType{
	private static final long serialVersionUID = 1L;
	@Override
	public String getPattern() {
		return "$ #,###.00";
	}
}

Tổng kết quả khi run:
d1

Posted in JAVA. Tags: . Leave a Comment »

Leave a comment