none
求出现“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值 ”的原因 RRS feed

  • 问题

  • using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.IO;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web;
    public class ExcelOutPuts
    {
            /// <summary>
            /// 导出Excel
            /// </summary>
            public void WriterExcel(DataTable dataSource)
            {
                StringWriter stringWriter = new StringWriter();
                HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
                DataGrid excel = new DataGrid();
                excel.DataSource = dataSource;//设置数据源
                excel.DataBind();
                excel.RenderControl(htmlWriter);
    
    
                if (true)
                {
                    HttpResponse resp = HttpContext.Current.Response;
                    resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
                    resp.AppendHeader("Content-disposition", "attachment;filename=ABC.xls");
                    resp.ContentType = "application/ms-excel";
                    resp.Write(Convert.ToString(stringWriter));
                    resp.End();//运行到这时报出:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值
                       //(运行页面A.aspx,有数据列表。点导出按钮,把数据查出来然后调用此方法。则报出以上异常,而且导出的数据为乱码(偶尔是正常,但是几率很小))
                    //(假如:在A.aspx页面点按钮,弹出新的页面B.aspx,然后再点导出。则不会出现异常,数据导出正确)
                    //所以不解,请高人们解释解释这是为什么
                    resp.Clear();
                }
                else
                {
                    string fileStr = filePath + fileName + "(" + DateTime.Now.ToShortDateString() + ").xls";  //filePath是文件的路径 
                    int pos = fileStr.LastIndexOf("\\");
                    string file = fileStr.Substring(0, pos);
                    if (!Directory.Exists(file))
                        Directory.CreateDirectory(file);
                    System.IO.StreamWriter sw = new StreamWriter(fileStr);
                    sw.Write(Convert.ToString(stringWriter));
                    sw.Close();
                }
    
            }
    }

    付出不一定有回报,不付出那就一定没有回报!
    2010年3月2日 9:09

答案

全部回复

  • 有可能是Response的问题,你加个try catch,进行捕捉下
    参照:
    http://shifengpsw.blog.163.com/blog/static/396074232009101873810289/


    努力+方法=成功
    2010年3月2日 9:18
  • 有可能是Response的问题,你加个try catch,进行捕捉下
    参照:
    http://shifengpsw.blog.163.com/blog/static/396074232009101873810289/


    努力+方法=成功

    那个错误我已经捕获了
    我主要的问题是:导出是乱码~
    出现异常就会导致,导出的是乱码
    付出不一定有回报,不付出那就一定没有回报!
    2010年3月3日 0:17
  • 你加上试试
      resp.Charset = "gb2312";
      resp.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");

    从GRIDVIEW导出的方法
      protected void Button1_Click(object sender, EventArgs e)
            {
                Response.Clear();
                Response.AddHeader("content-disposition", "subscription;filename=IBM_Reg.xls");
                Response.Charset = "gb2312";
                Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
                Response.ContentType = "application/IBM_Reg.xls";
                System.IO.StringWriter stringWrite = new System.IO.StringWriter();
                System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
                
                GridView1.RenderControl(htmlWrite);
    
                Response.Write(stringWrite.ToString());
                Response.End();
    
            }
            public override void VerifyRenderingInServerForm(Control control)
            {
    
            }

    努力+方法=成功
    • 已标记为答案 原HUGO.CM 2010年3月5日 11:01
    • 取消答案标记 原HUGO.CM 2010年3月5日 11:01
    2010年3月3日 1:28
  • 你加上试试
      resp.Charset = "gb2312";
      resp.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");

    从GRIDVIEW导出的方法
      protected void Button1_Click(object sender, EventArgs e)
    
            {
    
                Response.Clear();
    
                Response.AddHeader("content-disposition", "subscription;filename=IBM_Reg.xls");
    
                Response.Charset = "gb2312";
    
                Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
    
                Response.ContentType = "application/IBM_Reg.xls";
    
                System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    
                System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    
                
    
                GridView1.RenderControl(htmlWrite);
    
    
    
                Response.Write(stringWrite.ToString());
    
                Response.End();
    
    
    
            }
    
            public override void VerifyRenderingInServerForm(Control control)
    
            {
    
    
    
            }
    
    

    努力+方法=成功

    不只是中文,而且数字和英文出现不同程度的乱码,只有少数是对的
    付出不一定有回报,不付出那就一定没有回报!
    2010年3月3日 5:27
  • 我这里是正常的,如果不行,你改成UTF-8试试
    努力+方法=成功
    • 已标记为答案 原HUGO.CM 2010年3月5日 11:01
    2010年3月3日 5:39
  • 你好,


    你按照输出一个完整的html页面的方式试试。同时指定meta 的charset为你在后面指定的格式,如UTF-8或者GB2312之类的。
    <html>
    <header>
    <meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
    </header>
    <body>
    your content
    </body>
    </html>
    Microsoft Online Community Support
    2010年3月4日 3:40
  • 这个乱码问,是时有时无。
    到底出在什么地方啊~


    付出不一定有回报,不付出那就一定没有回报!
    2010年3月5日 10:22
  • GB2312 数据一多就乱码
    UTF-8 目前是没有问题。
    这又是为什么呢

    付出不一定有回报,不付出那就一定没有回报!
    2010年3月5日 11:00
  • 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值
    这个错误还是有,
    改成UTF-8,还是一样时有时无报错
    付出不一定有回报,不付出那就一定没有回报!
    2010年3月6日 9:51