Report in java – Step 7


Column grid – Containers – Hide Subtotal – Design Title

Trong phần này mình hướng dẫn các bạn tiếp tục các bước cơ bản trong dynamic report.

Làm tể nào dể có thể tạo ra các nhiều line trong 1 dòng, và thiết lập chart theo chiều ngang .

Mục đích bài viết thể hiện cho chúng ta thêm không gian để tạo ra 1 report đa dạng hơn.


package thaihoanghai.wordpress.com.demo;

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

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.style.StyleBuilder;
import net.sf.dynamicreports.report.constant.HorizontalAlignment;

public class App
{
    public static void main( String[] args ) throws Exception
    {
    	// 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));

    	TextColumnBuilder<String> itemColumn = col.column("Item", "item", type.stringType()).setStyle(boldStyle);
    	TextColumnBuilder<Integer> quantityColumn = col.column("Quantity", "quantity", type.integerType());
    	TextColumnBuilder<BigDecimal> unitPriceColumn = col.column("Unit Price", "unitprice", type.bigDecimalType());
    	// price = unitPrice * quantity
    	TextColumnBuilder<BigDecimal> priceColumn = unitPriceColumn.multiply(quantityColumn).setTitle("Price");
    	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));

    	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)
		//================================New code=====================================================
		.columnGrid(rowNumberColumn,quantityColumn,unitPriceColumn,grid.verticalColumnGridList(priceColumn,pricePercColumn))
		//=============================================================================================
		.groupBy(itemColumn)
		.subtotalsAtSummary(sbt.sum(unitPriceColumn),sbt.sum(priceColumn))
		.subtotalsAtFirstGroupFooter(sbt.sum(unitPriceColumn),sbt.sum(priceColumn))
		.title(Components.text("Simple Report")// Show Report title
			   .setHorizontalAlignment(HorizontalAlignment.CENTER))// Set position for title
		.pageFooter(Components.pageXofY().setStyle(boldCenteredStyle)) // show number of page at page footer
		//================================New code=====================================================
		.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();
		}
    }

}

Ok chúng ta quan sát 2 vị trí new code trong bài viết :

.columns(rowNumberColumn,itemColumn,quantityColumn,unitPriceColumn,priceColumn,pricePercColumn)
//================================New code=====================================================
.columnGrid(rowNumberColumn,quantityColumn,unitPriceColumn,grid.verticalColumnGridList(priceColumn,pricePercColumn))

Method:

.column => thể hiện các column sẻ được hiển thị mặc định các item sẻ có trong 1 line.

.columnGrid => Tùy chỉnh cách hiển thị trong 1 line, có thể bỏ đi các column mặc định và thể hiện các vị trí 1 cách khác nhau.

– Để tiết kiệm diện tích trên report chúng ta có thể hiển thị các Chart theo chiều ngang

.summary(cmp.horizontalFlowList(itemChart,itemChar2))

Sau đây kết quả sau khi run :

d1

Chúng ta chỉnh sửa code như sau để có thể ẩn đi bước tính toàn group không cần thiết.

// ===================new code===========================================================
    	ColumnGroupBuilder itemGroup = grp.group(itemColumn);
    	itemGroup.setPrintSubtotalsWhenExpression(exp.printWhenGroupHasMoreThanOneRow(itemGroup));
    	//====================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))
		// code new.......................
		.groupBy(itemGroup)
		//==================================
		.subtotalsAtSummary(sbt.sum(unitPriceColumn),sbt.sum(priceColumn))
		.subtotalsAtFirstGroupFooter(sbt.sum(unitPriceColumn),sbt.sum(priceColumn))
		.title(Components.text("Simple Report")// Show Report title
			   .setHorizontalAlignment(HorizontalAlignment.CENTER))// 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());

Giải thích :
ColumnGroupBuilder itemGroup = grp.group(itemColumn); itemGroup.setPrintSubtotalsWhenExpression(exp.printWhenGroupHasMoreThanOneRow(itemGroup));

Chúng ta thấy rằng việc tính tổng các thành phần trong price, unitprice của group Noki Chuông là không cần thiết vì nó chỉ có duy nhất 1 phần tử. chúng ta có thể bỏ qua việc tính toan này dựa vào lệnh trên

setPrintSubtotalsWhenExpression : parameter của method này nhận vào 1 điều điện để hiện thì Subtotal. ở đây chugn1 ta sẻ có điều kiện exp.printWhenGroupHasMoreThanOneRow(itemGroup) nếu itemGroup này có nhiều hơn 1 row thì nó sẻ thực hiện tính toàn subtotal ngược lại thì không cần hiển thị

.groupBy(itemGroup) :  report của chúng ta sẻ groupBy theo itemGroup được tạo ra phía trên

Hình ảnh :

d1


// ===================new code===========================================================
 ColumnGroupBuilder itemGroup = grp.group(itemColumn);
 itemGroup.setPrintSubtotalsWhenExpression(exp.printWhenGroupHasMoreThanOneRow(itemGroup));
 //====================End===========================================================

&nbsp;

.title(
 cmp.horizontalFlowList()
 .add(
cmp.image("logo.png").setFixedDimension(100, 100),
cmp.text("Simple Report").setStyle(titleStyle).setHorizontalAlignment(HorizontalAlignment.LEFT))
//cmp.text("Getting Started").setStyle(titleStyle).setHorizontalAlignment(HorizontalAlignment.RIGHT))
 .newRow()
 .add(cmp.filler().setStyle(stl.style().setTopBorder(stl.pen2Point())).setFixedHeight(10)))

Chúng ta định nghĩa titleStyle là style cho title của chúng ta.
cmp.image() : Tạo ra một image
cmp.filler() : Tạo ra một khung rổng

Chúng ta định nghĩa một filler để tạo tạo ra 1 khoảng trắng giữa title và column header của chúng ta
Thiết lập Top border trong filler và vẻ back line bên dười title.

HorizontalList : sắp xếp các component theo chiều ngang in 1 row.
d1

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: