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

posted @ 2010-05-23 21:33  wupingzsf  阅读(2153)  评论(1编辑  收藏  举报