无法理解代码以从HTML导出Excel电子表格

我被要求修改用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) 

我真的不明白这是做什么。

问题:

  1. 该代码生成一个常规的ASP.NET HtmlTable并将其分配给mytable 。 什么星球可以Excel打开HTML?

  2. 一般来说,在这里,我真的感到非常<!--[if gte mso 9] ,并且被<!--[if gte mso 9]评论所<!--[if gte mso 9] 。 任何人都可以帮助我理解这里发生了什么。

结果看起来有效,但我只是不熟悉这里的意图。 任何提示赞赏。

编辑

在进一步的testing中,问题似乎与给予文件(xls)的扩展有关。 如果我指出,Excel的当前版本将继续并加载文件。 但是所有格式都丢失了。 任何build议,这将是什么types的文件?

编辑

它看起来像原来的作者从这里得到的想法,虽然该网页并没有真正描述发生的事情。

UPDATE

感谢大家的回应。 根据他们如何解决上述问题,我将把这些答复归功于这些答复。 然而,为了我的目的,代码似乎一直工作。 现在看来,较新版本的Excel现在会警告用户,包含HTML的XLS文件是与文件扩展名build议的types不同的文件。 而且似乎除了使用CSV,OpenXML或其他方法导出外,没有什么可以做的。 我在这个博客中find了更多的细节。

代码基本上将HTML表格封装在一些与Excel相关的特殊XML标签(定义工作簿和工作表等)中。 这应该允许打开Excel或浏览器的输出。

回答你的问题:

  1. 该代码生成一个常规的ASP.NET HtmlTable并将其分配给mytable。 什么星球可以Excel打开HTML? 其实,这是Excel的一个function。 您可以使用XML和HTML标记的特殊组合来创build可在Web和Excel中打开的文件。 请参阅此MSDN文章: 如何在传输MIME内容时格式化Excel工作簿
  2. 一般来说,在这里,我真的感到非常<!--[if gte mso 9] ,并且被<!--[if gte mso 9]评论所<!--[if gte mso 9] 任何人都可以帮助我理解这里发生了什么。 这个具体的评论是检查MS Excel的可用性(无论是由Excel还是浏览器打开),我相信。 XML是在MS Excel中具有特殊含义的特定标签。 您可以从这里下载参考: Microsoft®Office HTML和XML参考

我在C#Corner上find这篇文章,对理解这种types的代码非常有帮助: 使用HTML创builddynamicExcel 。

据我所知Excel已经能够阅读HTML很长一段时间了。 这种方法很常见,但绝对不是最好的做法。

这个逻辑的重要部分在这里:

 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) 

Response.Write逻辑仅用于控制输出的工作簿和工作表。 如果该逻辑不存在,则该文件将打开三个工作表,类似于新的Excel工作簿。