2

我被要求对用 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.NETHtmlTable并将其分配给mytable. Excel 可以在哪个星球上打开 HTML?

  2. <!--[if gte mso 9]总的来说,这里的 XML 和评论让我有点失落。谁能帮我理解这里发生了什么。

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

编辑

在进一步测试中,问题似乎与文件的扩展名(xls)有关。如果我指出,当前版本的 Excel 将继续加载文件。但是所有格式都丢失了。关于这将是什么类型的文件有什么建议吗?

编辑

看起来原作者从这里得到了这个想法,尽管该页面并没有真正描述正在发生的事情。

更新

感谢大家的回复。我将根据他们如何解决上述问题来记入这些回复。但是,出于我的目的,代码似乎一直有效。似乎较新版本的 Excel 现在警告用户包含 HTML 的 XLS 文件是与文件扩展名所建议的类型不同的文件。除了使用 CSV、OpenXML 或其他方法导出之外,似乎对此无能为力。我在这个博客中找到了更多细节。

4

2 回答 2

1

据我所知,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 工作簿。

于 2013-09-27T20:00:16.043 回答
1

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

要回答您的问题:

  1. 该代码生成一个常规的 ASP.NET HtmlTable 并将其分配给 mytable。Excel 可以在哪个星球上打开 HTML? 实际上,这是 Excel 的一个功能。您可以使用 XML 和 HTML 标记的特殊组合来创建可在 Web 和 Excel 中打开的文件。请参阅此 MSDN 文章:如何在流式传输 MIME 内容时格式化 Excel 工作簿
  2. <!--[if gte mso 9]总的来说,这里的 XML 和评论让我有点失落。谁能帮我理解这里发生了什么。 我相信,该特定评论正在检查 MS Excel 的可用性(无论是由 Excel 还是浏览器打开)。XML 是在 MS Excel 中具有特殊含义的特定标签。您可以在此处下载参考:Microsoft® Office HTML 和 XML 参考

我发现 C# Corner 上的这篇文章对理解这种类型的代码很有帮助:使用 HTML 创建动态 Excel

于 2013-09-27T20:01:09.060 回答