博 之 文

以 拼 搏 设 计 梦 想 , 以 恒 心 编 程 明 天
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

导出Excel后台代码

Posted on 2012-03-04 17:31  IsNull_Soft  阅读(1930)  评论(0)    收藏  举报
/// <summary>
        /// 生成Excel并提示下载
        /// </summary>
        /// <param name="page">this.Page</param>
        /// <param name="TemplateName">模版Excel文件名</param>
        /// <param name="FileName">保存到本地的文件名</param>
        /// <param name="Dt">数据源</param>
        public static void OutputExcelX(Page page, string TemplateName, string FileName, DataTable Dt)
        {
            string tfilename = "file" + Comment.Handle.GetRndStr();
            string filePath = page.Server.MapPath("~/Temp/" + tfilename + ".xls");
            //删除已经存在的副本
            try
            {
                File.Delete(tfilename);
            }
            catch
            { }
            //从模版复制副本
            File.Copy(page.Server.MapPath("~/Template/" + TemplateName + ".xls"), filePath);
            //连接Excel
            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2;Connect Timeout=0;'");
            conn.Open();

            OleDbCommand cmd = new OleDbCommand();
            cmd.CommandTimeout = 5000;
            //输出内容
            StringBuilder sb = new StringBuilder();
            foreach (DataRow dr in Dt.Rows)
            {
                sb.Clear();
                for (int i = 0; i < Dt.Columns.Count; i++)
                {
                    Type tpdrcolumn = dr[i].GetType();
                    if (tpdrcolumn == System.Type.GetType("System.Int32") || tpdrcolumn == System.Type.GetType("System.Double") || tpdrcolumn == System.Type.GetType("System.Decimal"))
                    {
                        if (i == 0)
                            sb.Append(System.Web.HttpContext.Current.Server.HtmlEncode(dr[i].ToString()));
                        else
                            sb.Append("," + System.Web.HttpContext.Current.Server.HtmlEncode(dr[i].ToString()));
                    }
                    else
                    {
                        if (i == 0)
                            sb.Append("'" + System.Web.HttpContext.Current.Server.HtmlEncode(dr[i].ToString()) + "'");
                        else
                            sb.Append(",'" + System.Web.HttpContext.Current.Server.HtmlEncode(dr[i].ToString()) + "'");
                    }

                        //if (i == 0)
                        //    sb.Append("?");
                        //else
                        //    sb.Append(",?");
                   
                }
                cmd = new OleDbCommand("INSERT INTO [Sheet1$] values(" + sb.ToString() + ")", conn);
                //OleDbParameterCollection oleParam = cmd.Parameters;

                //oleParam.Clear();
                //for (int i = 0; i < Dt.Columns.Count; i++)
                //{
                //    OleDbType oleDbType = GetRefOleDataType(Dt.Columns[i]);

                ////此处是本版本改进中最实用的地方
                //    oleParam.Add(new OleDbParameter("@" + Dt.Columns[i].ColumnName, oleDbType));
                //}
                //for (int i = 0; i < oleParam.Count; i++)
                //{
                //oleParam[i].Value = dr[i];
                //}

                cmd.ExecuteNonQuery();
            }
            conn.Close();

            //输出生成的文件
            FileInfo file = new System.IO.FileInfo(filePath);

            System.Web.HttpContext.Current.Response.Clear();
            System.Web.HttpContext.Current.Response.Buffer = true;
            System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xls");
            System.Web.HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
            System.Web.HttpContext.Current.Response.ContentType = "application/ms-excel";
            System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            System.Web.HttpContext.Current.Response.BinaryWrite(File.ReadAllBytes(filePath));
            System.Web.HttpContext.Current.Response.Flush();
            System.Web.HttpContext.Current.Response.End();

            try
            {
                File.Delete(filePath);
            }
            catch
            {
                try
                {
                    File.Delete(filePath);
                }
                catch
                {
                }
            }
        }

 

 

 ///注:本例在微软无刷新UppdatePanel控件里不能使用,因为本例在UppdatePanel控件里没有回传信息,所以服务器未能收到回传信息导致无法运行;

Comment.OlxOperator.OutputExcelX(this,"employee_r","员工管理",dt);

 

Response.End()出错可以替换为HttpContext.Current.ApplicationInstance.CompleteRequest();