flex 合并单元格

flex中对于合并单元格没有很好的解决方案,有的可能会用OLAPDataGrid来实现,不过感觉效果还不是很好,下面有个例子:

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="creationCompleteHandler();">

<mx:Script>
<![CDATA[
import mx.rpc.AsyncResponder;
import mx.rpc.AsyncToken;
import mx.olap.OLAPQuery;
import mx.olap.OLAPSet;
import mx.olap.IOLAPQuery;
import mx.olap.IOLAPQueryAxis;
import mx.olap.IOLAPCube;
import mx.olap.OLAPResult;
import mx.events.CubeEvent;
import mx.controls.Alert;
import mx.collections.ArrayCollection;


//
// Format of Objects in the ArrayCollection:
//
// data:Object = {
// customer:"AAA",
// product:"ColdFusion",
// quarter:"Q1"
// revenue: "100.00"
// }
//

[Bindable]
private var flatData:ArrayCollection = new ArrayCollection(
[
{customer:"AAA", product:"ColdFusion", quarter:"Q1", revenue:210, cost:25},
{customer:"AAA", product:"Flex", quarter:"Q2", revenue:210, cost:25},
{customer:"AAA", product:"Dreamweaver", quarter:"Q3", revenue:250, cost:125},
{customer:"AAA", product:"Flash", quarter:"Q4", revenue:430, cost:75},

{customer:"BBB", product:"ColdFusion", quarter:"Q2", revenue:125, cost:20},
{customer:"BBB", product:"Flex", quarter:"Q3", revenue:210, cost:20},
{customer:"BBB", product:"Dreamweaver", quarter:"Q4", revenue:320, cost:120},
{customer:"BBB", product:"Flash", quarter:"Q1", revenue:280, cost:70},

{customer:"CCC", product:"ColdFusion", quarter:"Q3", revenue:375, cost:120},
{customer:"CCC", product:"Flex", quarter:"Q4", revenue:430, cost:120},
{customer:"CCC", product:"Dreamweaver", quarter:"Q1", revenue:470, cost:220},
{customer:"CCC", product:"Flash", quarter:"Q2", revenue:570, cost:170},

{customer:"AAA", product:"ColdFusion", quarter:"Q4", revenue:215, cost:90},
{customer:"AAA", product:"Flex", quarter:"Q1", revenue:210, cost:90},
{customer:"AAA", product:"Dreamweaver", quarter:"Q2", revenue:175, cost:190},
{customer:"AAA", product:"Flash", quarter:"Q3", revenue:670, cost:75},

{customer:"BBB", product:"ColdFusion", quarter:"Q1", revenue:175, cost:20},
{customer:"BBB", product:"Flex", quarter:"Q2", revenue:210, cost:20},
{customer:"BBB", product:"Dreamweaver",quarter:"Q3", revenue:120, cost:120},
{customer:"BBB", product:"Flash", quarter:"Q4", revenue:310, cost:70},

{customer:"CCC", product:"ColdFusion", quarter:"Q1", revenue:385, cost:120},
{customer:"CCC", product:"Flex", quarter:"Q2", revenue:340, cost:120},
{customer:"CCC", product:"Dreamweaver", quarter:"Q3", revenue:470, cost:220},
{customer:"CCC", product:"Flash", quarter:"Q4", revenue:270, cost:170},

{customer:"AAA", product:"ColdFusion", quarter:"Q1", revenue:100, cost:25},
{customer:"AAA", product:"Flex", quarter:"Q2", revenue:150, cost:25},
{customer:"AAA", product:"Dreamweaver", quarter:"Q3", revenue:200, cost:125},
{customer:"AAA", product:"Flash", quarter:"Q4", revenue:300, cost:75},

{customer:"BBB", product:"ColdFusion", quarter:"Q2", revenue:175, cost:20},
{customer:"BBB", product:"Flex", quarter:"Q3", revenue:100, cost:20},
{customer:"BBB", product:"Dreamweaver", quarter:"Q4", revenue:270, cost:120},
{customer:"BBB", product:"Flash", quarter:"Q1", revenue:370, cost:70},

{customer:"CCC", product:"ColdFusion", quarter:"Q3", revenue:410, cost:120},
{customer:"CCC", product:"Flex", quarter:"Q4", revenue:300, cost:320},
{customer:"CCC", product:"Dreamweaver", quarter:"Q1", revenue:510, cost:220},
{customer:"CCC", product:"Flash", quarter:"Q2", revenue:620, cost:170},

{customer:"AAA", product:"ColdFusion", quarter:"Q4", revenue:215, cost:90},
{customer:"AAA", product:"Flex", quarter:"Q1", revenue:210, cost:90},
{customer:"AAA", product:"Dreamweaver", quarter:"Q2", revenue:175, cost:190},
{customer:"AAA", product:"Flash", quarter:"Q3", revenue:420, cost:75},

{customer:"BBB", product:"ColdFusion", quarter:"Q1", revenue:240, cost:20},
{customer:"BBB", product:"Flex", quarter:"Q2", revenue:100, cost:20},
{customer:"BBB", product:"Dreamweaver", quarter:"Q3", revenue:270, cost:120},
{customer:"BBB", product:"Flash", quarter:"Q4", revenue:370, cost:70},

{customer:"CCC", product:"ColdFusion", quarter:"Q1", revenue:375, cost:120},
{customer:"CCC", product:"Flex", quarter:"Q2", revenue:420, cost:120},
{customer:"CCC", product:"Dreamweaver", quarter:"Q3", revenue:680, cost:220},
{customer:"CCC", product:"Flash", quarter:"Q4", revenue:570, cost:170}
]);

private function creationCompleteHandler():void {
// You must initialize the cube before you
// can execute a query on it.
myMXMLCube.refresh();
}

// Create the OLAP query.
private function getQuery(cube:IOLAPCube):IOLAPQuery {
// Create an instance of OLAPQuery to represent the query.
var query:OLAPQuery = new OLAPQuery;

// Get the row axis from the query instance.
var rowQueryAxis:IOLAPQueryAxis =
query.getAxis(OLAPQuery.ROW_AXIS);
// Create an OLAPSet instance to configure the axis.
var productSet:OLAPSet = new OLAPSet;
// Add the Product to the row to aggregate data
// by the Product dimension.
productSet.addElements(
cube.findDimension("ProductDim").findAttribute("Product").children);
// Add the OLAPSet instance to the axis.
rowQueryAxis.addSet(productSet);

// Get the column axis from the query instance, and configure it
// to aggregate the columns by the Quarter dimension.
var colQueryAxis:IOLAPQueryAxis =
query.getAxis(OLAPQuery.COLUMN_AXIS);
var quarterSet:OLAPSet= new OLAPSet;
quarterSet.addElements(
cube.findDimension("QuarterDim").findAttribute("Quarter").children);
colQueryAxis.addSet(quarterSet);

return query;
}

// Event handler to execute the OLAP query
// after the cube completes initialization.
private function runQuery(event:CubeEvent):void {
// Get cube.
var cube:IOLAPCube = IOLAPCube(event.currentTarget);
// Create a query instance.
var query:IOLAPQuery = getQuery(cube);
// Execute the query.
var token:AsyncToken = cube.execute(query);
// Setup handlers for the query results.
token.addResponder(new AsyncResponder(showResult, showFault));
}

// Handle a query fault.
private function showFault(result:Object, token:Object):void {
Alert.show("Error in query.");
}

// Handle a successful query by passing the query results to
// the OLAPDataGrid control..
private function showResult(result:Object, token:Object):void {
if (!result) {
Alert.show("No results from query.");
return;
}
myOLAPDG.dataProvider= result as OLAPResult;
}
]]>
</mx:Script>

<mx:OLAPCube name="FlatSchemaCube"
dataProvider="{flatData}"
id="myMXMLCube"
complete="runQuery(event);">

<mx:OLAPDimension name="CustomerDim">
<mx:OLAPAttribute name="Customer" dataField="customer"/>
<mx:OLAPHierarchy name="CustomerHier" hasAll="true">
<mx:OLAPLevel attributeName="Customer"/>
</mx:OLAPHierarchy>
</mx:OLAPDimension>

<mx:OLAPDimension name="ProductDim">
<mx:OLAPAttribute name="Product" dataField="product"/>
<mx:OLAPHierarchy name="ProductHier" hasAll="true">
<mx:OLAPLevel attributeName="Product"/>
</mx:OLAPHierarchy>
</mx:OLAPDimension>

<mx:OLAPDimension name="QuarterDim">
<mx:OLAPAttribute name="Quarter" dataField="quarter"/>
<mx:OLAPHierarchy name="QuarterHier" hasAll="true">
<mx:OLAPLevel attributeName="Quarter"/>
</mx:OLAPHierarchy>
</mx:OLAPDimension>

<mx:OLAPMeasure name="Revenue"
dataField="revenue"
aggregator="SUM"/>
</mx:OLAPCube>

<mx:Panel title="OLAPCube Control Example"
height="75%" width="75%" layout="horizontal"
paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">

<mx:OLAPDataGrid id="myOLAPDG" width="100%" height="100%"/>
</mx:Panel>
</mx:Application>

不过后来在网上看到MecGrid感觉还不错,所以拿上来与大家分享.
首先得把它的swc加进来,加到flex build path里面.
下面就是例子:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:MecGrid="com.mechan.MecGrid.*" creationComplete="initApp()" viewSourceURL="srcview/index.html">
<mx:Style>
FilterRenderer
{
fontSize: 8;
verticalScrollBarStyleName: filterRendererScrollStyle;
}

.filterRendererScrollStyle {
downArrowUpSkin: Embed(source="/assets/downArrow.png");
downArrowOverSkin: Embed(source="/assets/downArrow.png");
downArrowDownSkin: Embed(source="/assets/downArrow.png");
upArrowUpSkin: Embed(source="/assets/upArrow.png");
upArrowOverSkin: Embed(source="/assets/upArrow.png");
upArrowDownSkin: Embed(source="/assets/upArrow.png");
thumbDownSkin: Embed(source="/assets/thumb.png",
scaleGridLeft="7", scaleGridTop="5", scaleGridRight="8", scaleGridBottom="7");
thumbUpSkin: Embed(source="/assets/thumb.png",
scaleGridLeft="7", scaleGridTop="5", scaleGridRight="8", scaleGridBottom="7");
thumbOverSkin: Embed(source="/assets/thumb.png",
scaleGridLeft="7", scaleGridTop="5", scaleGridRight="8", scaleGridBottom="7");
trackSkin: Embed(source="/assets/scrolltrack.png",
scaleGridLeft="7", scaleGridTop="4", scaleGridRight="8", scaleGridBottom="6" );
}
</mx:Style>
<mx:Script>
<![CDATA[
import com.mechan.MecGrid.mecGridClasses.MecGridEvent;
import mx.collections.ArrayCollection;
import com.mechan.MecGrid.mecGridClasses.MecGridConst;
import com.mechan.MecGrid.mecGridClasses.CellOp;

// This demonstrates how you can set MecGrid properties by XML.
// You can build ResourceXML With MecGridWizard by Exporting and copy to clipboard the source XML.
//
// Reversely you can set the property of XML String to Binary data and vice versa.
//
[Bindable]
private var datasource:ArrayCollection;

private var dp:Array = [{selected:false, country:'Korea', city:'Ulsan', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'Korea', city:'Seoul', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'Korea', city:'Pusan', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'Korea', city:'Mokpo', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'Korea', city:'Anyang', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'Korea', city:'Sangju', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United States', city:'New York', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United States', city:'South Field', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United States', city:'Irvington', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United States', city:'Los Altos', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United States', city:'Chicago', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United States', city:'Tucson', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'France', city:'Paris', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'France', city:'Le Mans', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'France', city:'Lyon', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'France', city:'Marseille', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'Germany', city:'Berlin', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'Germany', city:'Hamburg', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'Germany', city:'Dusseldorf', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United Kingdom', city:'London', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United Kingdom', city:'Cambridge', qt1:0, qt2:0, qt3:0, qt4:0, avg:''},
{selected:false, country:'United Kingdom', city:'Birmingham', qt1:0, qt2:0, qt3:0, qt4:0, avg:''}]

private function initApp():void
{
mgrid.dragEnabled = true;
mgrid.dropEnabled = true;
mgrid.dragMoveEnabled = true;
mgrid.dropMode = MecGridConst.DRAGMODE_ROW | MecGridConst.DRAGMODE_COLUMN;

applyDataProvider();
}

private function applyDataProvider():void
{
var i:int;
var n:int = 0;

for (i=0; i < dp.length; i++)
{
dp[i].qt1 = Math.random() * 1000;
dp[i].qt2 = Math.random() * 1000;
dp[i].qt3 = Math.random() * 1000;
dp[i].qt4 = Math.random() * 1000;
n = i + mgrid.Rows.fixed;
dp[i].avg = "=(D" + n + " + E" + n + " + F" + n + " + G" + n + ") / 4";
}

mgrid.addEventListener(MecGridEvent.DATAPROVIDER_UPDATE_FINISHED, dataProviderUpdatedHandler);
datasource = new ArrayCollection(dp);
}

private function dataProviderUpdatedHandler(event:MecGridEvent):void
{
mgrid.removeEventListener(MecGridEvent.DATAPROVIDER_UPDATE_FINISHED, dataProviderUpdatedHandler);
mgrid.redraw = false;
mgrid.clearSubTotal();
mgrid.AddSubTotal("Total", [0, 1], MecGridConst.SUBTOTAL_SUM, -1, [2, 3, 4, 5], MecGridConst.SUBTOTAL_BELOWDATA);
mgrid.AddSubTotal("Country SubTotal", [1], MecGridConst.SUBTOTAL_SUM, 0, [2, 3, 4, 5], MecGridConst.SUBTOTAL_BELOWDATA);
mgrid.updateSubTotal();
mgrid.redraw = true;
}

private function changeData():void
{
applyDataProvider();
}

private function selectionModeChanged(event:Event):void
{
var selitem:String = uiSelectMode.selectedValue as String;
var selmode:int = CellOp.SELECT_SINGLE;

switch (selitem)
{
case "row":
selmode = selmode | CellOp.SELECTIONMODE_ROW;
break;
case "cell":
selmode = selmode | CellOp.SELECTIONMODE_CELL;
break;
}

mgrid.SelectionMode = selmode;
}
]]>
</mx:Script>
<MecGrid:MecGrid id="mgrid" bottom="40" right="10" top="80" left="10" dataProvider="{datasource}" EnableRowFilter="{cboShowFilter.selected}">
<MecGrid:ResourceXML>
<mx:XML xmlns="">
<List>
<option cols="6" fixedrows="2" fixedcols="0" merge_option="4" merge_option_fixedcolumn="0" merge_option_fixedrow="2" showspreadsheet="F" selectionmode="17" sortoption="0" treeview="T" treeColumn="0" textalignment="6" textalignment_fixed="5"/>
<columns>
<column name="col_1" datafield="country" visible="T" editable="F" colindex="0" autowidth="T" width="61" datatype="5" textalign="4" textalign_fixed="10" formatstring="" merge="T" style="" header="Country;Country"/>
<column name="col_2" datafield="city" visible="T" editable="F" colindex="1" autowidth="T" width="61" datatype="5" textalign="4" textalign_fixed="10" formatstring="" merge="T" style="" header="City;City"/>
<column name="col_3" datafield="qt1" visible="T" editable="F" colindex="2" autowidth="T" width="88" datatype="4" textalign="10" textalign_fixed="10" formatstring="#,###.##" merge="F" style="" header="Visitors;1st Quater (A)"/>
<column name="col_4" datafield="qt2" visible="T" editable="F" colindex="3" autowidth="T" width="92" datatype="4" textalign="10" textalign_fixed="10" formatstring="#,###.##" merge="F" style="test" header="Visitors;2nd Quater (B)"/>
<column name="col_5" datafield="qt3" visible="T" editable="F" colindex="4" autowidth="T" width="90" datatype="4" textalign="10" textalign_fixed="10" formatstring="#,###.##" merge="F" style="" header="Visitors;3rd Quater (C)"/>
<column name="col_6" datafield="qt4" visible="T" editable="F" colindex="5" autowidth="T" width="0" datatype="4" textalign="10" textalign_fixed="10" formatstring="#,###.##" merge="F" style="" header="Visitors;4th Quater (D)"/>
</columns>
<styles>
<style name="normal" backcolor1="16777215" backcolor2="16777215" bordercolor="12566463" borderthickness="1" fontstyle="0" forecolor="3355443"/>
<style name="fixedrow" backcolor1="15066597" backcolor2="15066597" bordercolor="6710886" borderthickness="1" fontstyle="0" forecolor="0"/>
<style name="fixedcolumn" backcolor1="16317653" backcolor2="15066597" bordercolor="6710886" borderthickness="1" fontstyle="0" forecolor="0"/>
<style name="spreadsheet" backcolor1="16317653" backcolor2="15066597" bordercolor="6710886" borderthickness="1" fontstyle="0" forecolor="0"/>
<style name="subtotal" backcolor1="16317653" backcolor2="15066597" bordercolor="12566463" borderthickness="1" fontstyle="2" forecolor="0"/>
<style name="test" backcolor1="13434879" backcolor2="16777215" bordercolor="12566463" borderthickness="1" fontstyle="5" forecolor="3355443"/>
</styles>
</List>
</mx:XML>
</MecGrid:ResourceXML>
</MecGrid:MecGrid>
<mx:Label x="10" y="10" text="MecGrid Demo with Row Filters" fontWeight="bold" fontSize="20" color="#FDFE88"/>
<mx:HBox width="100%" height="26" bottom="0">
<mx:LinkButton label="Copyright (c) 2008 MECHAN. All Rights Reserved"
click="navigateToURL(new URLRequest('http://code.google.com/p/flexspreadsheet/'));"
styleName="footerLink" alpha="0.2"
color="#DB93F9"/>
<mx:Spacer width="100%" />
<mx:LinkButton label="Created by MECHAN"
click="navigateToURL(new URLRequest('mailto:mechan93@gmail.com'));"
styleName="footerLink"
textDecoration="underline" alpha="0.2"
color="#04FCFF"/>
</mx:HBox>
<mx:Button label="Change Data" right="10" top="30" click="changeData()"/>
<mx:HBox y="54" right="10" left="10">
<mx:Label text="Selection Mode"/>
<mx:RadioButtonGroup id="uiSelectMode" change="selectionModeChanged(event)"/>
<mx:RadioButton label="Row Selection" groupName="uiSelectMode" value="row" selected="true"/>
<mx:RadioButton label="Cell Selection" groupName="uiSelectMode" value="cell"/>
<mx:CheckBox label="ShowFilter" id="cboShowFilter"/>
</mx:HBox>
</mx:Application>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值