直接嵌入 .CSS(或将其剥离)而不是 href 链接(Excel 导出第 2 部分)
直接嵌入 .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); } } } }