asp.net - 无法理解从 HTML 导出 Excel 电子表格的代码

标签 asp.net vb.net excel webforms

我被要求对用 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. 我真的对这里的 XML 以及 <!--[if gte mso 9] 感到有点损失。评论。谁能帮我理解这里发生了什么。

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

编辑

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

编辑

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

更新

谢谢大家的回复。我将根据他们如何解决上述问题来认可这些答复。然而,就我的目的而言,该代码似乎一直有效。似乎较新版本的 Excel 现在会警告用户,包含 HTML 的 XLS 文件的类型与文件扩展名建议的类型不同。除了使用 CSV、OpenXML 或其他方法导出之外,似乎对此无能为力。我在this blog中找到了更多详细信息.

最佳答案

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

回答您的问题:

  1. 该代码生成一个常规 ASP.NET HtmlTable 并将其分配给 mytable。 Excel 在哪个星球上可以打开 HTML? 实际上,这是 Excel 的一个功能。您可以使用 XML 和 HTML 标记的特殊组合来创建可在 Web 和 Excel 中打开的文件。请参阅这篇 MSDN 文章:How to format an Excel workbook while streaming MIME content
  2. 我真的对这里的 XML 以及 <!--[if gte mso 9] 感到有些失落。评论。任何人都可以帮助我了解这里发生了什么。 我相信该特定评论正在检查 MS Excel 的可用性(无论是由 Excel 还是浏览器打开)。 XML 是在 MS Excel 中具有特殊含义的特定标记。您可以在此处下载引用:Microsoft® Office HTML and XML Reference

我发现 C# Corner 上的这篇文章对于理解此类代码非常有帮助:Creating a Dynamic Excel Using HTML .

关于asp.net - 无法理解从 HTML 导出 Excel 电子表格的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19058682/

相关文章:

excel - 报告连接到值的行和列名称 (Microsoft Access)

c# - 如何强制 jqGrid 4.10.1-pre 始终对 ' 字符进行编码

c# - 以编程方式在 DotNetNuke 6 中创建文件夹

c# - Web API OData (OData Client v4) key 中的正斜杠

jquery - 使用 JQuery 从 .NET 下拉列表中获取选定值

vb.net - 启动默认浏览器 - Windows

vb.net - asp.net vb 网站循环遍历数据库行

.net - VB.NET:如何处理变量类型(参数和返回值)?

excel - 导入excel文件对现有数据返回null

vba - 使用 VBA Excel 2010 访问 JIRA