Source :
1. File Zul :
<?page title="ZK Pivottable: Airline Agency Sales" ?><zk> <window apply="demo.app.pivottable.PivotDemoBaseController" hflex="max"> <hlayout id="preDef" spacing="5px" sclass="z-valign-middle">Predefined scenario :</hlayout> <separator height="20px" /> <pivottable id="pivot" hflex="max"> <div></div> <div>Columns</div> <div>Rows</div> </pivottable> <separator height="20px" /> <groupbox closable="false" mold="3d"> <caption label="Field Control" /> <vlayout style="padding: 10px"> <pivot-field-control id="pfc" height="300px" /> <separator /> <hlayout spacing="10px" sclass="z-valign-middle"> Data field orientation : <radiogroup id="dataOrient"> <vlayout> <radio id="colOrient" label="column" /> <radio id="rowOrient" label="row" /> </vlayout> </radiogroup> <checkbox id="colGrandTotal" label="Enable grand total for columns" /> <checkbox id="rowGrandTotal" label="Enable grand total for rows" /> <checkbox id="autowrap" label="Enable Autowrap" /> </hlayout> </vlayout> </groupbox> </window></zk>
2. Controller :
2.1. pivotbasecontroller.java
package demo.app.pivottable;import java.text.SimpleDateFormat;import java.util.Date;import org.zkoss.pivot.Pivottable;import org.zkoss.pivot.impl.TabularPivotModel;import org.zkoss.pivot.ui.PivotFieldControl;import org.zkoss.zk.ui.Component;import org.zkoss.zk.ui.event.CheckEvent;import org.zkoss.zk.ui.event.Event;import org.zkoss.zk.ui.event.EventListener;import org.zkoss.zk.ui.select.SelectorComposer;import org.zkoss.zk.ui.select.annotation.Listen;import org.zkoss.zk.ui.select.annotation.Wire;import org.zkoss.zul.Button;import org.zkoss.zul.Checkbox;import org.zkoss.zul.Hlayout;import org.zkoss.zul.Radio;import org.zkoss.zul.Vlayout;public class PivotDemoBaseController extends SelectorComposer<Component> { private static final long serialVersionUID = 1L; @Wire private Pivottable pivot; @Wire private PivotFieldControl pfc; @Wire private Checkbox colGrandTotal, rowGrandTotal; @Wire private Radio colOrient, rowOrient; @Wire private Vlayout rawDataLayout; @Wire private Hlayout preDef; private TabularPivotModel pivotModel; @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); StaticPivotModelFactory pmf = StaticPivotModelFactory.INSTANCE; pivotModel = pmf.build(); pivot.setModel(pivotModel); pfc.setModel(pivotModel); loadConfiguration(pmf.getDefaultConfigurator()); // load predefined scenario for (PivotConfigurator conf : pmf.getConfigurators()) preDef.appendChild(getPreDefDiv(conf)); } @Listen("onCheck = #colGrandTotal") public void enableColumnGrandTotal(CheckEvent event) { pivot.setGrandTotalForColumns(event.isChecked()); } @Listen("onCheck = #rowGrandTotal") public void enableRowGrandTotal(CheckEvent event) { pivot.setGrandTotalForRows(event.isChecked()); } @Listen("onCheck = #dataOrient") public void enableDataOrient(CheckEvent event) { pivot.setDataFieldOrient(((Radio) event.getTarget()).getLabel()); } @Listen("onCheck = #autowrap") public void enableAutowrap(CheckEvent event) { pivot.setAutowrap(event.isChecked()); } private void initControls() { // grand totals colGrandTotal.setChecked(pivot.isGrandTotalForColumns()); rowGrandTotal.setChecked(pivot.isGrandTotalForRows()); // data orientation ("column".equals(pivot.getDataFieldOrient()) ? colOrient : rowOrient).setChecked(true); pfc.syncModel(); // field control } private String renderRawData(Object object, String fname) { if ("Agent".equals(fname) || "Customer".equals(fname)) { String[] names = ((String) object).split(" ", 2); return Character.toUpperCase(names[0].charAt(0)) + ". " + names[1]; } else if ("Date".equals(fname)) { SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); return format.format((Date) object); } return object == null ? "(null)" : object.toString(); } private Component getPreDefDiv(final PivotConfigurator conf) { Button scenarioBtn = new Button(conf.getTitle()); scenarioBtn.setSclass("predef"); scenarioBtn.addEventListener("onClick", new EventListener<Event>() { public void onEvent(Event event) throws Exception { loadConfiguration(conf); } }); return scenarioBtn; } private void loadConfiguration(PivotConfigurator conf) { pivotModel.clearAllFields(true); conf.configure(pivotModel); conf.configure(pivot); pivot.setPivotRenderer(conf.getRenderer()); initControls(); }}
2.2. pivotconfigurator.java
package demo.app.pivottable;import org.zkoss.pivot.PivotRenderer;import org.zkoss.pivot.Pivottable;import org.zkoss.pivot.impl.TabularPivotModel;public abstract class PivotConfigurator { private final String title; public PivotConfigurator(String title) { this.title = title; } public String getTitle() { return title; } public abstract void configure(TabularPivotModel model); public abstract void configure(Pivottable table); public abstract PivotRenderer getRenderer();}
2.3. staticpivotmodelfactory.java
package demo.app.pivottable;import java.text.SimpleDateFormat;import java.util.Comparator;import java.util.Date;import org.zkoss.pivot.GroupHandler;import org.zkoss.pivot.PivotField;import org.zkoss.pivot.PivotHeaderContext;import org.zkoss.pivot.PivotRenderer;import org.zkoss.pivot.Pivottable;import org.zkoss.pivot.impl.SimplePivotRenderer;import org.zkoss.pivot.impl.StandardCalculator;import org.zkoss.pivot.impl.TabularPivotModel;public class StaticPivotModelFactory { public static final StaticPivotModelFactory INSTANCE = new StaticPivotModelFactory(); private StaticPivotModelFactory() { } public TabularPivotModel build() { return new TabularPivotModel(PivotData.getData(), PivotData.getColumns()); } // configurator // public PivotConfigurator getDefaultConfigurator() { return CONFIG_CITY_SALES; } public PivotConfigurator[] getConfigurators() { return new PivotConfigurator[] { CONFIG_PERFORMANCE, CONFIG_CITY_SALES, CONFIG_SALES_RACE }; } public static final PivotConfigurator CONFIG_PERFORMANCE = new PivotConfigurator("Performance") { public void configure(TabularPivotModel model) { model.setFieldType("Airline", PivotField.Type.COLUMN); model.setFieldType("Flight", PivotField.Type.COLUMN); model.setFieldType("Agent", PivotField.Type.ROW); model.setFieldType("Customer", PivotField.Type.ROW); model.setFieldType("Price", PivotField.Type.DATA); model.setFieldType("Mileage", PivotField.Type.DATA); model.setFieldSubtotals("Airline", new StandardCalculator[] { StandardCalculator.AVERAGE, StandardCalculator.COUNT }); model.setFieldSubtotals("Agent", new StandardCalculator[] { StandardCalculator.AVERAGE, StandardCalculator.COUNT }); } public void configure(Pivottable table) { table.setDataFieldOrient("column"); } public PivotRenderer getRenderer() { return null;//use default } }; public static final PivotConfigurator CONFIG_CITY_SALES = new PivotConfigurator("Sales by City") { public void configure(TabularPivotModel model) { model.setFieldType("Origin", PivotField.Type.COLUMN); model.setFieldType("Destination", PivotField.Type.COLUMN); model.setFieldType("Airline", PivotField.Type.ROW); model.setFieldType("Flight", PivotField.Type.ROW); model.setFieldType("Customer", PivotField.Type.DATA); model.setFieldType("Price", PivotField.Type.DATA); } public void configure(Pivottable table) { table.setDataFieldOrient("row"); } public PivotRenderer getRenderer() { return null;//use default } }; public static final PivotConfigurator CONFIG_SALES_RACE = new PivotConfigurator("Sales Race!") { public void configure(TabularPivotModel model) { model.setFieldType("Agent", PivotField.Type.COLUMN); model.setFieldType("Date", PivotField.Type.ROW); model.setFieldType("Customer", PivotField.Type.DATA); model.setFieldType("Price", PivotField.Type.DATA); // sort by last name, then first name model.setFieldKeyComparator("Agent", new Comparator<Object>() { public int compare(Object k1, Object k2) { String s1 = (String) k1; String s2 = (String) k2; int i1 = s1.lastIndexOf(' '); int i2 = s2.lastIndexOf(' '); int cmp = s1.substring(i1 + 1).compareTo(s2.substring(i2 + 1)); if (cmp != 0) return cmp; String fname1 = i1 < 0 ? "" : s1.substring(0, i1).trim(); String fname2 = i2 < 0 ? "" : s2.substring(0, i2).trim(); return fname1.compareTo(fname2); } }); // sort date by descending order model.getField("Date").setGroupHandler(new GroupHandler() { public Object getGroup(Object data) { SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); return format.format((Date) data); } }); model.setFieldKeyOrder("Date", false); } public void configure(Pivottable table) { table.setDataFieldOrient("column"); } public PivotRenderer getRenderer() { return SALES_RACE_RENDERER; } }; private static final PivotRenderer SALES_RACE_RENDERER = new SimplePivotRenderer() { public int getColumnSize(Pivottable table, PivotHeaderContext colc, PivotField dataField) { if (dataField != null && "Price".equals(dataField.getFieldName())) return 200; return colc.isGrandTotal() && dataField != null ? 150 : 100; } public String renderCellSClass(Number data, Pivottable table, PivotHeaderContext rowContext, PivotHeaderContext columnContext, PivotField dataField) { if (dataField != null && "Price".equals(dataField.getFieldName())) { String sclass = "highlight"; if (!rowContext.isGrandTotal() && !columnContext.isGrandTotal() && data != null && data.doubleValue() > 300) sclass += " important"; return sclass; } return null; } public String renderCellStyle(Number data, Pivottable table, PivotHeaderContext rowContext, PivotHeaderContext columnContext, PivotField dataField) { if (columnContext.isGrandTotal()) return "color: #11EE11; font-weight: bold"; return null; } };}
3. Model :
Hasil :
Reference : https://www.zkoss.org/zkdemo/chart