Flex+.NET实现Chart图表导出图片

需求:如题。

思路:客户端将UIComponent转化为BitmapData,再转为ByteArray,将ByteArray上传到服务端,服务端发送文件到客户端。

实现:
1.mxml部分
<!—Chart 其中vbChart为我们要转化为图片的界面控件-->
<mx:VBox width="100%"
         height="120%" id="vbChart" verticalGap="0" horizontalAlign="center">
    <mx:Label text="{chartTitle}" styleName="chartTitle"/>
    <mx:ColumnChart height="100%"
                    width="100%"
                    fontSize="12"
                    showDataTips="true"
                    dataProvider="{dataArr}">
        <mx:verticalAxis>
            <mx:LinearAxis baseAtZero="true"
                           title="雨量(mm)"/>
        </mx:verticalAxis>
        <mx:horizontalAxis>
            <mx:DateTimeAxis id="haxis" dataUnits="days" displayLocalTime="true" labelFunction="formatDate"/>
        </mx:horizontalAxis>
        <mx:series>
            <mx:ColumnSeries xField="PPTN_date"
                             yField="SUM_DRP"
                             displayName="降雨量(mm)"
                             showDataEffect="slideIn"
                             hideDataEffect="slideOut"/>
        </mx:series>
    </mx:ColumnChart>
</mx:VBox>

2.as部分
public static function ChartToImg(target:UIComponent,name:String=""):void
{
    var bitmapData : BitmapData = new BitmapData(target.width, target.height); 
    bitmapData.draw(target);  
    var png:PNGEncoder = new PNGEncoder(); 
    var pngByteArray : ByteArray = png.encode(bitmapData);
    var url:String="../ChartImg.aspx";
    if(name!="")
        url=url+"?name="+name;
    var request:URLRequest = new URLRequest(encodeURI(url)); 
    request.contentType = 'applicatoin/octet-stream'; 
    request.data = pngByteArray;
    request.method = URLRequestMethod.POST;
    navigateToURL(request, "_blank");
}

3.C#部分
protected void Page_Load(object sender, EventArgs e)
{
    string name = "";
    try
    {
        name = Request.QueryString["name"].ToString();
    }
    catch (Exception err)
    {
        name = DateTime.Now.ToShortTimeString();
    }

    int upFileLength = Request.ContentLength;
    string contentType = Request.ContentType;
    byte[] FileArray = new Byte[upFileLength];
    System.IO.Stream fileStream = Request.InputStream;
    fileStream.Read(FileArray, 0, upFileLength);//至此准备好了文件流 FileArray

    Response.Buffer = true;
    Response.Clear();
    Response.ContentType = "application/octet-st";
    Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(name).Replace("+"," ") + ".png");
    Response.BinaryWrite(FileArray);
    Response.Flush();
    Response.End();
}

posted @ 2009-12-25 15:01  蛤蟆王子  阅读(134)  评论(0编辑  收藏  举报