我被要求对用 VB 编写的 ASP.NET WebForms 应用程序进行更改(我通常使用 C#)。
一项任务是尝试修复 Excel 下载。客户报告说,当他尝试在 Excel 中打开电子表格时,收到一个错误,说明电子表格已损坏。
导出 Excel 下载的代码出现在专用 ASPX 页面的 Load 事件中。看起来像这样:
Dim mytable As New HtmlTable
mytable = [Populate HTML Table Here]
mytable = returnclass.displaytable
mytable.Border = 1
mytable.BorderColor = "#CCCCCC"
HttpContext.Current.Response.Clear()
HttpContext.Current.Response.Buffer = True
Response.Write("<html xmlns:x=""urn:schemas-microsoft-com:office:excel"">")
Response.Write("<head>")
Response.Write("<!--[if gte mso 9]><xml>")
Response.Write("<x:ExcelWorkbook>")
Response.Write("<x:ExcelWorksheets>")
Response.Write("<x:ExcelWorksheet>")
Response.Write("<x:Name>" & worksheetTitle & "</x:Name>")
Response.Write("<x:WorksheetOptions>")
Response.Write("<x:Print>")
Response.Write("<x:ValidPrinterInfo/>")
Response.Write("</x:Print>")
Response.Write("</x:WorksheetOptions>")
Response.Write("</x:ExcelWorksheet>")
Response.Write("</x:ExcelWorksheets>")
Response.Write("</x:ExcelWorkbook>")
Response.Write("</xml>")
Response.Write("<![endif]--> ")
Response.Write("</head>")
Response.Write("<body>")
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=hhexport.xls ")
HttpContext.Current.Response.Charset = ""
'ouput table to html so excel can interperet.
Me.EnableViewState = False
Dim stringWriter As New System.IO.StringWriter()
Dim htmlWriter As New System.Web.UI.HtmlTextWriter(stringWriter)
mytable.RenderControl(htmlWriter)
HttpContext.Current.Response.Write(stringWriter.ToString)
我真的不明白这是在做什么。
问题:
该代码生成一个常规 ASP.NET
HtmlTable
并将其分配给mytable
. Excel 可以在哪个星球上打开 HTML?<!--[if gte mso 9]
总的来说,这里的 XML 和评论让我有点失落。谁能帮我理解这里发生了什么。
结果似乎有效,但我只是不熟悉这里的意图。任何提示表示赞赏。
编辑
在进一步测试中,问题似乎与文件的扩展名(xls)有关。如果我指出,当前版本的 Excel 将继续加载文件。但是所有格式都丢失了。关于这将是什么类型的文件有什么建议吗?
编辑
看起来原作者从这里得到了这个想法,尽管该页面并没有真正描述正在发生的事情。
更新
感谢大家的回复。我将根据他们如何解决上述问题来记入这些回复。但是,出于我的目的,代码似乎一直有效。似乎较新版本的 Excel 现在警告用户包含 HTML 的 XLS 文件是与文件扩展名所建议的类型不同的文件。除了使用 CSV、OpenXML 或其他方法导出之外,似乎对此无能为力。我在这个博客中找到了更多细节。