[ExtJS5学习笔记]第三十六节 报表组件mzPivotGrid
mzPivotGrid 是一个报表组件,采用这个组件之后,可以令你的应用体现更多的价值。
什么是pivot grid
extjs的面板panel对于展示大批量数据来说是pefect的,并且还提供了各种各样的展示方式。但是唯一缺少一个pivot grid,当需要做数据报表的时候,pivot grid就起作用了。
什么是mzPivotGrid
mzPivotGrid是可以在extjs中使用的表格报表组件,你只需要引入组件就可以制作报表了。
学习资源
官方网站: http://www.mzsolutions.eu/mzPivotGrid.html
extjs官网推荐博客:http://www.sencha.com/blog/mzpivotgrid-a-pivot-table-for-ext-js?mkt_tok=3RkMMJWWfF9wsRokvq3BZKXonjHpfsX77%2BsqWK%2B0lMI%2F0ER3fOvrPUfGjI4JSMZ0dvycMRAVFZl5nR9dFOOdfQ%3D%3D
API DOChttp://www.mzsolutions.eu/docs/
与图表组件的融合
看效果图;
而完成这个报表仅仅需要以下这些代码即可。
Ext.onReady(function() {
Ext.tip.QuickTipManager.init();
var height = 250, width = 700;
var store = new Ext.data.JsonStore({
filters: [
function(item) {
return item.get(\'year\') >= 2012;
}
],
proxy: {
type: \'ajax\',
url: \'charts.json\',
reader: {
type: \'json\',
root: \'rows\'
}
},
autoLoad: true,
fields: [
{name: \'orderid\', type: \'int\'},
{name: \'salesperson\', type: \'string\'},
{name: \'country\', type: \'string\'},
{name: \'orderdate\', type: \'date\', dateFormat: \'d/m/Y\'},
{name: \'amount\', type: \'int\'},
{
name: \'person-range\',
convert: function(v, record){
if(/^[a-j]/i.test(record.get(\'salesperson\'))) return \'A-J\';
if(/^[k-s]/i.test(record.get(\'salesperson\'))) return \'K-S\';
if(/^[t-z]/i.test(record.get(\'salesperson\'))) return \'T-Z\';
return v;
}
},{
name: \'year\',
convert: function(v, record){
return Ext.Date.format(record.get(\'orderdate\'), "Y");
}
}
]
});
var pivotChart = null;
var pivotGrid = Ext.create(\'Mz.pivot.Grid\', {
renderTo: document.body,
title: \'Chart integration\',
height: height,
width: width,
enableLocking: false,
enableGrouping: true,
viewConfig: {
trackOver: true,
stripeRows: false
},
tbar: [{
xtype: \'combo\',
itemId: \'idSelect\',
fieldLabel: \'Select report\',
flex: 1,
editable: false,
//value: \'r1\',
store: [
[\'r1\', \'What are the order amounts of each salesperson?\'],
[\'r2\', \'What are the order amounts of each salesperson in a specific country?\'],
[\'r3\', \'How did salespeople perform in a specific year?\']
],
listeners: {
change: function(combo, newValue, oldValue, eOpts){
switch(newValue){
case \'r1\':
pivotGrid.reconfigurePivot({
topAxis: []
});
break;
case \'r2\':
pivotGrid.reconfigurePivot({
topAxis: [{
dataIndex: \'country\',
direction: \'ASC\'
}]
});
break;
case \'r3\':
pivotGrid.reconfigurePivot({
topAxis: [{
dataIndex: \'year\',
direction: \'ASC\'
}]
});
break;
}
}
}
}],
store: store,
aggregate: [{
measure: \'amount\',
header: \'Sales\',
aggregator: \'sum\',
align: \'right\',
width: 85,
renderer: Ext.util.Format.numberRenderer(\'0,000.00\')
}],
caption: \'\',
leftAxis: [{
width: 80,
id: \'salesperson\',
dataIndex: \'salesperson\',
header: \'Sales person\'
}],
topAxis: [],
listeners: {
afterrender: function(pivotGrid){
setTimeout(function(){
var combo = pivotGrid.down(\'#idSelect\');
combo.select(combo.getStore().getAt(0));
}, 100);
},
pivotdone: function(){
if(pivotChart){
pivotChart.destroy();
}
var fields = [],
titles = [],
columns = pivotGrid.headerCt.getGridColumns();
for(var i = 0; i < columns.length; i++){
if(!columns[i].leftAxis){
fields.push(columns[i].dataIndex);
titles.push(columns[i].text);
}
}
pivotChart = Ext.create(\'Ext.chart.Chart\', {
renderTo: document.body,
width: width,
height: height,
store: pivotGrid.getPivotStore(),
legend: {
position: \'top\'
},
axes: [{
title: \'Sales person\',
type: \'Category\',
fields: [\'salesperson\'],
position: \'bottom\'
},{
title: \'Total\',
fields: fields,
type: \'Numeric\',
position: \'left\'
}],
series: [{
type: \'column\',
highlight: true,
axis: \'bottom\',
xField: \'salesperson\',
yField: fields,
title: titles
}]
});
}
}
});
});
看不同层次的报表只需要一次配置即可