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();
}