【问题标题】:Trouble Understanding Code to Export Excel Spreadsheet from HTML无法理解从 HTML 导出 Excel 电子表格的代码
【发布时间】:2013-09-27 19:31:11
【问题描述】:

有人要求我对用 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 和 &lt;!--[if gte mso 9] 评论感到非常失望。谁能帮我理解这里发生了什么。

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

编辑

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

编辑

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

更新

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

【问题讨论】:

  • 是的,Excel 会像打开 Excel 单元格一样打开 HTML 表格。我见过的所有 Excel sn-ps 都没有包含&lt;html xmlns:x=""urn:schemas-microsoft-com:office:excel""&gt; 的部分。我只是实现这里找到的方法:aspfree.com/c/a/c-sharp/…
  • 呃!谢谢,但是,该网站的代码格式很糟糕。让人很难看清是什么。
  • 是的,这不是最好的格式,但它是第一个使用我熟悉的代码的格式。
  • 嗯,这似乎给了我完全相同的结果。 Excel 报告该文件的格式与文件扩展名指定的格式不同。
  • 但它仍然可以打开,对吧?这种方法总是发生在我身上。

标签: asp.net vb.net excel webforms


【解决方案1】:

代码基本上将 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 和 &lt;!--[if gte mso 9] 评论感到非常失望。任何人都可以帮助我了解这里发生了什么。 我相信,具体的评论是检查 MS Excel 的可用性(无论是由 Excel 还是浏览器打开)。 XML 是在 MS Excel 中具有特殊含义的特定标签。您可以在这里下载参考资料:Microsoft® Office HTML and XML Reference

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多