MSchart有自带的导出图片功能,但是路径只能写死,不能自由选择路径后再导出,不方便客户使用,经研究几天后,得出了一些结论。
1.SaveFileDialog
一开始在网上搜索后,大多数人都建议SaveFileDialog类中的ShowDialog()可以实现弹出路径选择框,选择路径后将路径传给chart1.SaveImage(localFilePath);
代码如下:
public void ExportChart(Chart chart1, IWin32Window form1) { //SystemInformation.UserInteractive = true; SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Title = "保存文件"; saveFileDialog.Filter = "JPG文件(*.jpg)|*.jpg|PDF文件(*.pdf)|*.pdf|GIF文件(*.gif)|*.gif|所有文件(*.*)|*.*"; //默认文件类型显示顺序 saveFileDialog.FilterIndex = 2; //记忆上次保存路径 saveFileDialog.RestoreDirectory = true; if (saveFileDialog.ShowDialog(form1) == DialogResult.OK) { if (!string.IsNullOrEmpty(saveFileDialog.FileName)) { string localFilePath = saveFileDialog.FileName.ToString(); chart1.SaveImage(localFilePath); } } }
在此过程中存在一个问题无法解决,SaveFileDialog只支持Windows.Forms而不支持网页中弹出选择路径框,会报错。所以该思路被毙掉。
2.Response
第二种就是以流的形式导出图片,但是MSChart图片是控件图片,没有以文件的形式保存在本地或服务器上,所以我们先导出一个图片到本地,再提供一个下载的功能,将该图片下载到客户指定的路径处,最后一点,就是删除我们内部指定的路径下的图片,这一点很重要。
代码如下:
/// <summary> /// MSChart导出图片 /// </summary> /// <param name="fileName">文件名</param> /// <param name="chart1">空间ID</param> public void ExportChart(string fileName,Chart chart1) { fileName += ".jpg"; string basePath = string.Format("d:\\{0}", fileName);//指定图片生成的路径,用来下载,最后要删除该路径下的图片 chart1.SaveImage(basePath);//导出图片 byte[] bytes = null; using (FileStream stream = new FileStream(basePath, FileMode.Open)) { bytes = new byte[(int)stream.Length]; stream.Read(bytes, 0, bytes.Length); //读取流信息 } //因为我这个函数是写在类中的,所以Response用的是 //System.Web.HttpContext.Current ,如果该函数是写在asp.net页面中的则使用System.Web.UI.Page中的Response System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream"; System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); System.Web.HttpContext.Current.Response.BinaryWrite(bytes); System.Web.HttpContext.Current.Response.Flush(); System.Web.HttpContext.Current.Response.End(); File.Delete(basePath); //删除原路径下的图片 }