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)
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 :
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:
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"; } }
Leave a comment