之前做过winfrom程序的导出excel文件的功能,感觉非常简单。现在试着做asp.net中导出excel的功能,之前用的是Microsoft.Office.Interop.Excel这个对象来实现数据导出excel,在asp.net上完全被它给恶心到了。首先是不能弹出保存对话框,然后又是在代码执行到Microsoft.Office.Interop.Excel.Application myexcel = new Microsoft.Office.Interop.Excel.Application();这一句的时候,莫名其妙的不动了,这个问题在调试的时候没有出现,在发布后才出来了,后来找到一个方法给解决了,就是中配置文件的<system.web>下添加<identity impersonate="true" userName="administrator" password="0"/>,其中的用户名和密码就是本机的用户名和密码。这个问题解决之后,又遇到了令人痛苦的SaveAs保存异常,错误提示是:Exception from HRESULT: 0x800A03EC。在网上找遍了资料,都没能解决问题。不得已,只好尝试其他的导出excel的方案了。

下面的方案才是我最想要的,就简单明了的介绍一下:

首先是建一个web页,里面就一个按钮用来实现导出excel,代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript">
        //Excel DownLoad
        function excelExport() {
//            var hidText = document.getElementById("hidParam");
//            hidText.value = "some params";
            document.getElementById("ExcelOutput").click();
        }
</script> 

</head>
<body>
    <form id="form1" runat="server">
    <input type="button" value="EXCEL下载" style="width:100px;" onclick="excelExport()" id="excelBut" />
<%--<input id="hidParam" type="text" runat="server" style="display:none;"/> --%>
<asp:Button runat="server" ID="ExcelOutput" style="display:none" Text= "EXCEL出力" Width="0px" onclick="btnExcel_Click" UseSubmitBehavior="false"/>
<asp:GridView ID="gvExcel" runat="server" Height="95px" Visible="False"></asp:GridView> 

    </form>
</body>
</html>

其中注释掉部分可以用于向后台代码传递你想要的数据。

后台代码如下:

public partial class WebForm2 : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnExcel_Click(object sender, EventArgs e)
        {
            string strExcelName = "MyExcel.xls";
            strExcelName = strExcelName.Replace(@"/", "");
            DataTable dt = new DataTable();
            DataColumn dc = null;
            dc = dt.Columns.Add("编号", Type.GetType("System.Int32"));
            dc = dt.Columns.Add("产品", Type.GetType("System.String"));
            dc = dt.Columns.Add("版本", Type.GetType("System.String"));
            dc = dt.Columns.Add("描述", Type.GetType("System.String"));

            DataRow dr = dt.NewRow();
            dr[;
            dr["产品"] = "这个地方是单元格的值";
            dr["版本"] = "2.0";
            dr["描述"] = "这个地方是单元格的值";
            dt.Rows.Add(dr);
            dr = dt.NewRow();
            dr[;
            dr["产品"] = "这个地方是单元333格的值";
            dr["版本"] = "3.0";
            dr["描述"] = "这个地方是单元格的33值";
            dt.Rows.Add(dr);

            gvExcel.Visible = true;
            gvExcel.DataSource = null;

            gvExcel.DataSource = dt;
            gvExcel.DataBind();

            ExportToExcel(this.Page, gvExcel, strExcelName); 

        }

        public void ExportToExcel(System.Web.UI.Page page, GridView excel, string fileName)
           {
             try
              {
                foreach (GridViewRow row in excel.Rows)
                {
                    ; i < row.Cells.Count; i++)
                        {
                            excel.HeaderRow.Cells[i].BackColor = System.Drawing.Color.Yellow;
                          }
                }
                excel.Font.Size = ;
                excel.AlternatingRowStyle.BackColor = System.Drawing.Color.LightCyan;
                excel.RowStyle.Height = ;
                //page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); //如果出现中文乱码,就用这句
                page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
                page.Response.Charset = "utf-8";
                page.Response.ContentType = "application/vnd.ms-excel";
                page.Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>");
                excel.Page.EnableViewState = false;
                excel.Visible = true;
                excel.HeaderStyle.Reset();
                excel.AlternatingRowStyle.Reset(); 

                System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
                System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
                excel.RenderControl(oHtmlTextWriter);
                page.Response.Write(oStringWriter.ToString());
                page.Response.End(); 

                excel.DataSource = null;
                excel.Visible = false;
               }
               catch (Exception e)
               {                 }
             }
                }

这里为了突出介绍的重点,对于数据的获取就没有介绍了。这里面有个问题,就是当程序执行到

excel.RenderControl(oHtmlTextWriter); 这一句的时候,报了个错:控件必须放在具有 runat=server 的窗体标记内,这个只需要重写方法VerifyRenderingInServerForm就是了。
public override void VerifyRenderingInServerForm(Control control)
        {
            // 这个方法必须要的,不然在下面的代码excel.RenderControl(oHtmlTextWriter); 处会报错:控件必须放在具有 runat=server 的窗体标记内
        }

之前我中vs2010 中做这个导出功能的时候是没有遇到这个问题的,但是中vs2013 中却遇到了。

好了,这种方式就介绍完了,它的好处就在于没有哪些乱七八糟的异常,同时也会弹出一个提示框用于选择保存的路径。

 

asp.net 导出excel文件的更多相关文章

  1. ASP.NET导出Excel文件

    第一种最常见,并且最简单的方式,直接把GridView导出,导出格式为文本表格形式. protected void btnSaveExcel_Click(object sender, EventArg ...

  2. ASP.NETCore -----导出Excel文件并下载

    本事例分为nopi(安装DotNetCore.NPOI)下载和EPPlus(EPPlus.Core.dll)下载,其中npoi下载演示的是根据执行的模板进行数据下载 npoi帮助类NpoiExcelU ...

  3. ASP.NET 导出EXCEL文件处理多对应排列的

    这次项目遇到了一个导出excel需要对应排列的问题.本来在做这个项目之前都基本没做过excel导出的菜鸡,这次强行做还是有些忐忑的,加上那个表的结构比较奇特.    废话不多说,先介绍表结构吧 是数据 ...

  4. ASP.NET 导出excel文件出现乱码的解决办法

    string html =TABLE ;//<table>标签,可以是多张表string modified = Regex.Replace(html, "<table &g ...

  5. 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法

    -----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...

  6. ASP.NET Core导入导出Excel文件

    ASP.NET Core导入导出Excel文件 希望在ASP.NET Core中导入导出Excel文件,在网上搜了一遍,基本都是使用EPPlus插件,EPPlus挺好用,但商用需要授权,各位码友若有好 ...

  7. Asp.net导出Excel续章(自定义合并单元格,非Office组件)

    结合上次写的导出Excel方法,这次上头要求我将列头进行一下合并 以前的效果: 改进后的效果: 在上篇文章中写到了Excel的导出方法,这次为了避免在生产环境中使用Office组件,服务器各种权限配置 ...

  8. asp.net导出excel示例代码

    asp.net导出excel的简单方法. excel的操作,最常用的就是导出和导入. 本例使用NPOI实现. 代码:/// <summary> );             ;       ...

  9. [转] Asp.Net 导出 Excel 数据的9种方案

    湛刚 de BLOG 原文地址 Asp.Net 导出 Excel 数据的9种方案 简介 Excel 的强大之处在于它不仅仅只能打开Excel格式的文档,它还能打开CSV格式.Tab格式.website ...

随机推荐

  1. ACdreamOJ 1154 Lowbit Sum (数字dp)

    ACdreamOJ 1154 Lowbit Sum (数位dp) ACM 题目地址:pid=1154" target="_blank" style="color ...

  2. IOS将UIView转化为UIImage

    +(UIImage*)createImageFromView:(UIView*)view { //obtain scale CGFloat scale = [UIScreen mainScreen]. ...

  3. Effective C++:条款35:考虑virtual函数以外的其它选择

    游戏中的人物伤害值计算问题. (一)方法(1):一般来讲能够使用虚函数的方法: class GameCharacter { public: virtual int healthValue() cons ...

  4. 用户 'IIS APPPOOL\DefaultAppPool'登录失败

    今天发布网站遇到这个问题.问题直接说明iis  应用程序池. 后来百度发现是应用程序池  进程模型中的标识项设置问题,这个我用的是本地数据库所以是localsystem.在此小弟谢谢这位 http:/ ...

  5. java学习之Date的使用

    Date使用,主要要注意将日期格式化,否则返回的是系统默认的格式.请自己查阅API文档. import java.util.*; import java.text.*; public class Te ...

  6. 在Android Studio中进行单元测试和UI测试

    本篇教程翻译自Google I/O 2015中关于测试的codelab,掌握科学上网的同学请点击这里阅读:Unit and UI Testing in Android Studio.能力有限,如有翻译 ...

  7. github教程--廖雪峰的官方网站

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  8. 获得创建临时表的session id

    通过sql server的default trace和tempdb中的sys.objects视图,你能够获得创建临时表的session id,下面是相应的sql语句: DECLARE @FileNam ...

  9. How to Avoid Producing Legacy Code at the Speed of Typing

    英语不好翻译很烂.英语好的去看原文. About the Author I am a software architect/developer/programmer.I have a rather p ...

  10. list集合接口

    import java.util.ArrayList; import java.util.List; class Phone { private String brand; private doubl ...