问题:用asp.net的GridView控件导出excel时,在excel2003中没有问题,但用excel2007中访问会出现提示对话框。
目的:当用asp.net的GridView控件导出excel时,如果客户段用excel2007打开不弹出对话框,并且保留GridView的样式效果。曾经使用用过的方法:(注:因为项目的原因下列方法都不能使用,主要是不能修改客户端的任何设置)
1.修改客户端的注册表键值。(修改excel2007的warning 级别)
2.修改客户端ie的设置。(用vb的脚本实现到处)
3.用cvs或txt等格式打开。(缺点不能保存GridView的样式)
4.用xml文件格式到处。(当客户端本地的xml默认打开方式不是excel时,将会出现问题)各位大侠能否给小弟提供一个新的解决方法吗?万分感谢

解决方案 »

  1.   

    这个问题我也遇见过,出警告框是因为导出的并不是真正的excel格式,如果你直接写Response导出的话,你这个问题无解...建议在服务端处理,生成临时的excel再通过Response写往客户端,然后在服务端干掉临时的excel.
      

  2.   

    感谢楼主的热心解答,我忘了说了。我们的服务器不允许安装office组件。用服务器端的方法我也试过了。是可以。但是公司的需求比较变态。在加上microsoft也不建议使用这种方法。(主要是死进程麻烦呀:))
      

  3.   

    导出数据到excel模板
    参考
      

  4.   

    谢谢楼主的解答,其实excel2007的warning是因为文件格式不匹配而弹出的。向这种方法导出的其实都是html文件。在excel2003不提示。但excel2007中会提示。所以你这个方法也不行。当然谢谢你帮助。
      

  5.   

    用response.binerrywrite的方法直接输出。
      

  6.   

    试了不行,excel2007主要检查格式,流最终还是要转换为相应的格式。代码如下:System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);        DataTable dt = new DataTable();
            dt = CreateDataTable();
            GridView1.DataSource = dt;
            GridView1.DataBind();        GridView1.RenderControl(oHtmlTextWriter);
            string fileName = HttpUtility.UrlEncode("aaa.xls", Encoding.GetEncoding("utf-8"));
            StreamWriter wter = File.CreateText(Server.MapPath("..") + "\\temp" + "\\" + fileName);
            wter.Write(oStringWriter.ToString());
            wter.Close();
            oStringWriter.Close();        FileStream MyFileStream; 
            long FileSize;        MyFileStream = new FileStream(Server.MapPath("..") + "\\temp" + "\\" + fileName, FileMode.Open); 
            FileSize = MyFileStream.Length;         byte[] Buffer = new byte[(int)FileSize]; 
            MyFileStream.Read(Buffer, 0, (int)FileSize); 
            MyFileStream.Close(); 
            FileInfo fileInfo = new FileInfo(Server.MapPath("..") + "\\temp" + "\\" + fileName);
            Response.Clear();
            Response.ClearContent();
            Response.ClearHeaders();
            Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />");        Response.AddHeader("Content-Disposition", "attachment;filename=" +fileName);
           // Response.AddHeader("Content-Length", (fileInfo.Length + 68).ToString());       // Response.AddHeader("Content-Transfer-Encoding", "binary");
           // Response.ContentType = "application/octet-stream";
            Response.ContentEncoding = System.Text.Encoding.UTF8;        // Response.WriteFile(fileInfo.FullName); 
            Response.BinaryWrite(Buffer);
           // Response.WriteFile(Server.MapPath("..") + "\\temp" + "\\" + fileName);
           
            Response.Flush();
            if (System.IO.File.Exists(Server.MapPath("..") + "\\temp" + "\\" + fileName))
                System.IO.File.Delete(Server.MapPath("..") + "\\temp" + "\\" + fileName);
            Response.End();