【问题标题】:OpenXML Open SpreadsheetDocument from HTMLOpenXML 从 HTML 打开电子表格文档
【发布时间】:2014-08-11 15:58:48
【问题描述】:

我正在尝试使用 MVC5 从 HTML 文件创建 excel 文件。我的 HTML 是一个在 HTML 标记中带有一些附加标记的表格

<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Test</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>
    <colgroup>
        <col style="width: 2%;">
        <col style="width: 16%;">
        <col style="width: 32%;">
        <col style="width: 16%;">
        <col style="width: 16%;">
        <col style="width: 16%;">
        <col style="width: 2%;">
    </colgroup>
    <thead>
        ...
    </thead>
    <tbody id="worksheetBody">
        ...        
    <tfoot>
        ...
    </tfoot>
</table>

我使用互操作库进行了这项工作,但这显然不是一个非常合理的解决方案,因为部署起来很麻烦。这是我工作的代码。

        var wb = app.Workbooks.Open(Filename: @"C:\test.html");
        wb.SaveAs(Filename: @"C:\tmp.xlsx", FileFormat: XlFileFormat.xlOpenXMLWorkbook);
        wb.Close();

您看到我这样做的原因是,在下面的 Fiddle 中,您会收到一个恼人的弹出窗口,提示文件扩展名与格式不同。

http://jsfiddle.net/lesson8/wVejP/

我正在尝试使用 OpenXML 复制上述代码,但在调用 SpreadsheetDocument.Open 方法时,它说我的文件已损坏,这与我在互操作代码中使用的文件相同。关于如何在不使用 Interop 的情况下实现这一目标的任何想法?

【问题讨论】:

  • 您在 .html 文件上调用 Open()
  • 在 OpenXML 和互操作代码中都是。互操作代码有效,OpenXML 抛出错误说“文件包含损坏的数据”
  • 是的,因为(正如我的回答所示)html 不是 Excel 文件的有效 OpenXml 格式。

标签: c# html asp.net-mvc excel openxml-sdk


【解决方案1】:

由于 Html 不是有效格式,因此它需要 Excel 文件的 OpenXml 结构。

OpenXml 用于读取或写入 Excel 文件,没有与您正在执行的操作类似的代码。您的代码正在使用 OLE 自动化来转换 html 文件。这是一个概述如何使用的链接:

http://blogs.office.com/2014/06/25/open-xml-sdk-goes-open-source/

【讨论】: