65.9K
CodeProject 正在变化。 阅读更多。
Home

直接嵌入 .CSS(或将其剥离)而不是 href 链接(Excel 导出第 2 部分)

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011 年 10 月 24 日

CPOL
viewsIcon

15168

直接嵌入 .CSS(或将其剥离)而不是 href 链接(Excel 导出第 2 部分)

这是一个导出到 Excel 的示例,但我们以嵌入方式注入 .css,而不是使用 href 链接,后者可能会因您的服务器环境而失败。 如果您正在进行某些类型的 URL 重写,css href 链接也可能失败,尽管这通常不是针对 URL 重写的。 这也展示了一种良好的剥离方法。
/// <summary>
/// Summary description for ReportBase
/// </summary>
public class ReportBase : Page
{
    const string ExcelExport = "ExcelExport";
   
    public ReportBase()
    {
        this.Load += new EventHandler(ReportBase_Load);
    }
    void ReportBase_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Session.Add(ExcelExport, Request.QueryString[ExcelExport]);
        }
        
    }
    protected override void Render(HtmlTextWriter writer)
    {
        if (Session[ExcelExport] != null && bool.Parse(Session[ExcelExport].ToString()))
        {
            using (System.IO.StringWriter stringWrite = new System.IO.StringWriter())
            {
                using (RewriteLinkHtmlTextWriter htmlWrite = new RewriteLinkHtmlTextWriter(stringWrite))
                {
                    base.Render(htmlWrite);
                    DownloadExcel(stringWrite.ToString());
                }
            }
        }
        else
        {
            base.Render(writer);
        }
    }

    public void DownloadExcel(string text)
    {
        try
        {
            HttpResponse response = Page.Response;
            response.Clear();
            response.AddHeader("cache-control", "must-revalidate");
            response.ContentType = "application/vnd.ms-excel";
            response.Write(text); 
            response.Flush();
            response.End();
        }
        catch (ThreadAbortException)
        {
            //If the download link is pressed we will get a thread abort.
        }
    }
     public class RewriteLinkHtmlTextWriter : HtmlTextWriter
     {
         #region Constructors
 
         public RewriteLinkHtmlTextWriter(HtmlTextWriter writer) : base(writer)
         {
             
             this.InnerWriter = writer.InnerWriter;
         }
 
         public RewriteLinkHtmlTextWriter(System.IO.TextWriter writer)    : base(writer)
         {
             this.InnerWriter = writer;
         }
 
         #endregion
 
        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name == "href")
            {
              
                
                HttpContext Context = HttpContext.Current;
                string contextItemKey = value + "HrefAlreadyWritten";
                if (Context.Items[contextItemKey] == null)
                {
                    //URL Rewrite
                    //string sStylesheetName = value;
                    //int iSlashPos = value.LastIndexOf("../");
                    //if (iSlashPos >= 0) sStylesheetName = value.Substring(iSlashPos + 3);
                    //value = VirtualPathUtility.ToAbsolute("~/" + sStylesheetName);
                    // CSS Embedding
                    WebRequest request = WebRequest.Create(HttpContext.Current.Server.MapPath(value));
                    // The credentials may be required if we get a 401.
                    request.Credentials = CredentialCache.DefaultCredentials;
                    string cssResponse = String.Empty;
                    using (WebResponse webresponse = request.GetResponse())
                    {
                        using (Stream dataStream = webresponse.GetResponseStream())
                        {
                            StreamReader reader = new StreamReader(dataStream);
                            cssResponse = reader.ReadToEnd();
                        }
                    }
//Comment out this write to effectively just strip out the css
                    Write("></link><style TYPE=\"text/css\"> <!--" + cssResponse + "-->");
                    Context.Items[contextItemKey] = true;
                }
            }
            else
            {
                base.WriteAttribute(name, value, fEncode);
            }
        }
   }
}
© . All rights reserved.