OpenflashChart(三) Flash转换成image,并插入Excel,Excel提供下载
Flash 转换成image 有两种方法
一 、通过javascript 把FLASH 把div 转成Image ,这种方法在客户端显示。不能保存到服务器。
< script src= "js/jquery-1.2.6.min.js" type= "text/javascript" ></ script>
< script type= "text/javascript" src= "js/swfobject.js" ></ script>
< script type= "text/javascript" >
swfobject.embedSWF (
"open-flash-chart.swf" , "my_chart" ,
"550" , "250" , "9.0.0" , "expressInstall.swf" ,
{ "data-file" : "gallery/3d-bar-chart.php" } ) ;
</ script>
// 这里使用jQuery 来操作,不喜欢这个框架的,可以使用Javascript 。查看:http://teethgrinder.co.uk/open-flash-chart-2/save-image-js.php
< script type= "text/javascript" >
OFC = {} ;
OFC.jquery = {
name : "jQuery" ,
version: function ( src) { return $( '#' + src)[ 0 ] .get_version () } ,
rasterize: function ( src, dst) { $( '#' + dst) .replaceWith ( OFC.jquery .image ( src)) } ,
image: function ( src) { return "<img src='data:image/png;base64," + $( '#' + src)[ 0 ] .get_img_binary () + "' />" } ,
popup: function ( src) {
var img_win = window.open ( '' , 'Charts: Export as Image' )
with ( img_win.document ) {
write ( '<html><head><title>Charts: Export as Image< \/ title>< \/ head><body>' + OFC.jquery .image ( src) + '< \/ body>< \/ html>' ) }
// stop the 'loading...' message
img_win.document .close () ;
}
}
// Using an object as namespaces is JS Best Practice. I like the Control.XXX style.
//if (!Control) {var Control = {}}
//if (typeof(Control == "undefined")) {var Control = {}}
if ( typeof ( Control == "undefined" )) { var Control = { OFC: OFC.jquery }}
// By default, right-clicking on OFC and choosing "save image locally" calls this function.
// You are free to change the code in OFC and call my wrapper (Control.OFC.your_favorite_save_method)
// function save_image() { alert(1); Control.OFC.popup('my_chart') }
function save_image() { alert ( 1 ) ; OFC.jquery .popup ( 'my_chart' ) }
function moo() { alert ( 99 ) ; } ;
</ script>
<INPUT TYPE =BUTTON OnClick ="OFC.jquery.rasterize('my_chart', 'img_chart_1')" VALUE ="Add image in the table" >
OFC.jquery.rasterize('my_chart', 'img_chart_1')
//
rasterize 是转换成图片
my_chart 、 img_chart_1 为div 的ID my_chart 为显示FLASH 的。。
mg_chart_1 就是把Image 转换成图片显示的ID
OFC.jquery.rasterize('my_chart', 'my_chart'); 这个就在原div 里转换成图片
OFC.jquery.popup('my_chart') 为打开一个新页面。输出一个图片 。
二 、使用 Post 圖片到服務器
这个又有两种传递方式。先介绍复杂的,自己研究了好久的。 - -
一: javascirpt 傳递 base64 編碼圖片
Image: function ( src) { return "<img src='data:image/png;base64," + document.getElementById ( src) .get_img_binary () + "' />" } ,
1 )、 src 為 Flash DIV 的 ID
2 )、 data:image/png;base64," + document.getElementById ( src) .get_img_binary () 為 flash 轉換成 Base64 格式的圖片
二、 Post the image 把圖片上傳至服務器
function post_image_2(debug)
{
url = "Save_image.aspx?name=" + $("#my_chart" )[0].get_img_binary() +"" ;
var ofc = findSWF("my_chart" );
// call our objects image_saved() method when finished
x = ofc.post_image( url, 'my_chart.image_saved' , debug );
}
1) 、 url 為把圖片傳到的頁面, name 就是傳遞圖片的參數 ----
$("#my_chart" )[0].get_img_binary() 為 Base64 格式的圖片 這里用到 jQuery 要引用
2 )、 post_image 第二個參數只是彈出對話窗,顯示的字符串
3 ) debug 這里是 Boolen , true 是已新窗口形式打開 Save_image.aspx 頁面,
False 在本窗口處理,不打開頁面,但執行 Save_image.aspx 頁面 有回發到該頁面
注:::: IE6 、 IE7 是不支持 Base64 編碼 所以在 IE6 、 IE7 中不能彈窗,不能顯示圖片
三、 Save_image.aspx 頁的編碼
1、 由於 Base64 編碼在地址傳值時,會把字符串的“ + ”轉成“ ”(空格),所以在取值時需要替換
string strname = Request.QueryString["name" ].ToString();
Base64ToImage( strname.Replace(' ' , '+' ));
2 、
/// <summary>
/// 把 Base64 編碼轉成 圖片保存至服務器
/// </summary>
/// <param name="base64String"></param>
public void Base64ToImage(string base64String)
{
// base64String.Substring(0, base64String.Length / 40 * 40) 主要是 Base64 編碼長度有規定必須是 0 或 4 的整數倍,所以為免出錯,把長度處理一下
try
{
byte [] imageBytes = Convert .FromBase64String(base64String.Substring(0, base64String.Length / 40 * 40));
// byte[] imageBytes = Convert.FromBase64String(base64String.Substring(0,128));
MemoryStream ms = new MemoryStream (imageBytes, 0,
imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
System.Drawing.Image image = System.Drawing.Image .FromStream(ms, true );
image.Save(Server.MapPath("Report" ), ImageFormat .Png);
}
catch (Exception ex)
{
Response.Write("<javascript>alert('" + ex.Message + "')</javascript>" );
}
//}
}
在使用Convert.ToBase64String() 对字符串进行Base64 编码时,注意的几点:
例:string s = "Hello";
byte[] bytes = Convert.FromBase64String(s);
以上代码在运行时会抛出FormatException 异常. 提示为:Base-64 字符数组的无效长度
原因:
当Convert.FromBase64String 方法的参数s 的长度小于4 或不是4 的偶数倍时,将会抛出FormatException 。
例:
Convert.FromBase64String("Hell"); // Normal.
Convert.FromBase64String("Hell "); // Normal. (忽略空格)
Convert.FromBase64String("Hello!"); // throw FormatException.
Convert.FromBase64String("Hello Net"); // Normal. (忽略空格)
附:
// 把圖片轉換成 Base64 編碼的函數
public string ImageToBase64(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat format)
{
using (MemoryStream ms = new MemoryStream ())
{
// Convert Image to byte[]
image.Save(ms, format);
byte [] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert .ToBase64String(imageBytes);
return base64String;
}
}
四、圖片插入 EXCEL 并 保存到服務器
1 )、 InsertPictureToExcel 類
/**/
/// <summary>
/// InsertPictureToExcel 的摘要说明
/// </summary>
public class InsertPictureToExcel
{
private Excel.Application m_objExcel = null ;
private Excel.Workbooks m_objBooks = null ;
private Excel._Workbook m_objBook = null ;
private Excel.Sheets m_objSheets = null ;
private Excel._Worksheet m_objSheet = null ;
private Excel.Range m_objRange = null ;
private object m_objOpt = System.Reflection.Missing .Value;
/**/
/// <summary>
/// 打开没有模板的操作。
/// </summary>
public void Open()
{
this .Open(String .Empty);
}
/**/
/// <summary>
/// 功能:实现Excel 应用程序的打开
/// </summary>
/// <param name="TemplateFilePath"> 模板文件物理路径 </param>
public void Open(string TemplateFilePath)
{
// 打开对象
m_objExcel = new Excel.Application ();
m_objExcel.Visible = false ;
m_objExcel.DisplayAlerts = false ;
if (m_objExcel.Version != "11.0" )
{
//MessageBox.Show(" 您的 Excel 版本不是 11.0 (Office 2003 ),操作可能会出现问题。");
m_objExcel.Quit();
return ;
}
m_objBooks = (Excel.Workbooks )m_objExcel.Workbooks;
if (TemplateFilePath.Equals(String .Empty))
{
m_objBook = (Excel._Workbook )(m_objBooks.Add(m_objOpt));
}
else
{
m_objBook = m_objBooks.Open(TemplateFilePath, m_objOpt, m_objOpt, m_objOpt, m_objOpt,
m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
}
m_objSheets = (Excel.Sheets )m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet )(m_objSheets.get_Item(1));
//m_objExcel.WorkbookBeforeClose += new Excel.AppEvents_WorkbookBeforeCloseEventHandler(m_objExcel_WorkbookBeforeClose);
// 這里 WEB 不能用,沒去研究,先注釋 ,在 WNDOW FORMS 里可以
}
private void m_objExcel_WorkbookBeforeClose(Excel.Workbook m_objBooks, ref bool _Cancel)
{
//MessageBox.Show(" 保存完毕!");
}
/**/
/// <summary>
/// 将图片插入到指定的单元格位置。
/// 注意:图片必须是绝对物理路径
/// </summary>
/// <param name="RangeName"> 单元格名称,例如:B4 </param>
/// <param name="PicturePath"> 要插入图片的绝对路径。 </param>
public void InsertPicture(string RangeName, string PicturePath)
{
m_objRange = m_objSheet.get_Range(RangeName, m_objOpt);
m_objRange.Select();
Excel.Pictures pics = (Excel.Pictures )m_objSheet.Pictures(m_objOpt);
pics.Insert(PicturePath, m_objOpt);
}
/**/
// <summary>
// 将图片插入到指定的单元格位置,并设置图片的宽度和高度。
// 注意:图片必须是绝对物理路径
// </summary>
// <param name="RangeName"> 单元格名称,例如:B4</param>
// <param name="PicturePath"> 要插入图片的绝对路径。</param>
// <param name="PictuteWidth"> 插入后,图片在Excel 中显示的宽度。</param>
// <param name="PictureHeight"> 插入后,图片在Excel 中显示的高度。</param>
//public void InsertPicture(string RangeName, string PicturePath, float PictuteWidth, float PictureHeight)
//{
// m_objRange = m_objSheet.get_Range(RangeName, m_objOpt);
// m_objRange.Select();
// float PicLeft, PicTop;
// PicLeft = Convert.ToSingle(m_objRange.Left);
// PicTop = Convert.ToSingle(m_objRange.Top);
// 参数含义:
// 图片路径
// 是否链接到文件
// 图片插入时是否随文档一起保存
// 图片在文档中的坐标位置(单位: points )
// 图片显示的宽度和高度(单位: points )
// 参数详细信息参见:http://msdn2.microsoft.com/zh-cn/library/aa221765(office.11).aspx
// m_objSheet.Shapes.AddPicture(PicturePath, Microsoft.Office.Core.MsoTriState.msoFalse,
// Microsoft.Office.Core.MsoTriState.msoTrue, PicLeft, PicTop, PictuteWidth, PictureHeight);
//}
/**/
/// <summary>
/// 将Excel 文件保存到指定的目录,目录必须事先存在,文件名称不一定要存在。
/// </summary>
/// <param name="OutputFilePath"> 要保存成的文件的全路径。 </param>
public void SaveFile(string OutputFilePath)
{
m_objBook.SaveAs(OutputFilePath, m_objOpt, m_objOpt,
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode .xlNoChange,
m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
this .Close();
}
/**/
/// <summary>
/// 关闭应用程序
/// </summary>
private void Close()
{
m_objBook.Close(false , m_objOpt, m_objOpt);
m_objExcel.Quit();
}
/**/
/// <summary>
/// 释放所引用的COM 对象。注意:这个过程一定要执行。
/// </summary>
public void Dispose()
{
ReleaseObj(m_objSheets);
ReleaseObj(m_objBook);
ReleaseObj(m_objBooks);
ReleaseObj(m_objExcel);
System.GC .Collect();
System.GC .WaitForPendingFinalizers();
}
/**/
/// <summary>
/// 释放对象,内部调用
/// </summary>
/// <param name="o"></param>
private void ReleaseObj(object o)
{
try
{
System.Runtime.InteropServices.Marshal .ReleaseComObject(o);
}
catch { }
finally { o = null ; }
}
}
2 )、調用類方法 --- 完成圖片插入 Excel 并保存至服務器
// 圖片保存到Excel ,并將Excel 保存到服務器
string picPath1 = Server.MapPath("Report.jpg" ).ToString();
InsertPictureToExcel ipt = new InsertPictureToExcel ();
ipt.Open();
ipt.InsertPicture("B2" , picPath1);
// ipt.InsertPicture("B8", picPath2, 120, 80);
ipt.SaveFile(Server.MapPath("ExcelTest1.xls" ));
ipt.Dispose();
五、 Excel 提供下載
FileInfo fi = new FileInfo (Server.MapPath("ExcelTest1.xls" ));
if (fi.Exists)
{
Response.Clear();
// string file_name = fi.Name.Substring(randomnum.ToString().Length, fi.Name.Length - randomnum.ToString().Length);
Response.AddHeader("Content-Disposition" , "attachment; filename=" + System.Web.HttpUtility .UrlEncode("FRE01011.xls" , System.Text.Encoding .UTF8));
Response.AddHeader("Content-Length" , fi.Length.ToString());
Response.ContentType = "application/octet-stream" ;
Response.Filter.Close();
Response.WriteFile(fi.FullName);
HttpContext .Current.ApplicationInstance.CompleteRequest();
}
上面的方法浏览器兼容不好。其实 openflashchart 内部就有传递一个参数。当时不懂。。现在也不太懂。。呵。。看下面。
function post_image() {
$("#my_chart" )[0].post_image( "Save_image.aspx?name=postimage" , '' , true );
}
Save_image.aspx?name=postimage" , 其实这个方法它应该做了把图片 post 页面去了。。(不知道怎么实现!!)
在 Save_image.aspx 页只要
Request.SaveAs(Server.MapPath("Report.jpg" ).ToString(), false ); 就能保存到服务器。。插入 EXCEL 和给客户端下载 与上同。!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liaolian9948/archive/2009/11/23/4857582.aspx