【问题标题】:ASP.NET generated excel file has different format than extensionASP.NET 生成的 excel 文件的格式与扩展名不同
【发布时间】:2021-11-11 23:30:18
【问题描述】:

我有一个用旧的 asp.net 2.0 制作的 web 应用程序。我需要生成带有特定格式表的 excel 文件(如果我可以加载模板并且只将数据放在代码后面,这是最好的方法)。为此,我正在尝试使用这个库 CarlosAg.ExcelXmlWriter: http://www.carlosag.net/tools/excelxmlwriter/sample

最终文件生成得非常好,但是当我尝试在 MS Excel 中打开它时,会出现警告弹出窗口,其中显示文件的格式与扩展名不同 (xls)。如果我信任文件的来源,我还会质疑是否要打开它。当我单击是时,文件正确打开。在另一台使用不同版本 Excel 的电脑上,也有警告,但不同 - 文件已损坏且无法打开,在移动设备中相同(无法打开)。有趣的是 - 我可以在不同的办公程序中正确打开该文件而不会出现任何警告,例如。 WPS 办公室。 所以我退后两步,尝试打开卡洛斯库样本生成的简单文件,效果是一样的。是否有机会在代码中“修复”文件,以便 MS Excel 也可以在没有任何警告的情况下正确打开它?

    Dim book As Workbook = New Workbook()
    Dim sheet As Worksheet = book.Worksheets.Add("Sample")
    Dim row As WorksheetRow = sheet.Table.Rows.Add()
    row.Cells.Add("Hello World")
    book.Save("D:\Folder\test.xls")

【问题讨论】:

    标签: asp.net excel xmlwriter


    【解决方案1】:

    您必须提供文件扩展名 xlsx。

    旧的 xls 实际上是办公文件的遗留(封闭)二进制格式。

    但是,自 office 2007 起,Microsoft 对所有 office 文档都采用了开放 xml 格式(好吧,outlook pst 和 MS-Access 是例外)。事实上,如果您使用任何办公文档(word、power-point、excel)等,请尝试将 xlsx 文档重命名为 zip 文件。您发现您现在可以打开 zip 存档,并且可以查看/查看甚至修改该文档中的 xml。

    (请尝试将此重命名为 zip 文件以获取乐趣和咯咯笑声 - 您会看到实际上您甚至不需要任何 3rd 方工具来打开、播放和弄乱 zip 存档中的内容(所以,所有office 文档实际上是一个简单的 zip 存档!!!)。

    所以,较新的办公文件格式实际上是 xml 标记 - 你可以修改它!!

    无论如何,毫无疑问,您正在使用的库因此使用上述功能/事实的办公文档现在是 xml 格式,而不是专有的 Microsoft 二进制格式 - 事实上,您现在可以在任何能够修改此类文档的计算机上打开一个 zip 文件,然后修改文本文件。

    因此,您为文档名称提供了一个旧的二进制文件名 (xls),但打开了一个 xml 格式的文件(纯文本),因此 Excel 正在检测这个事实/问题。因此,您需要为该文档提供 open office xml 格式扩展名 (xlsx)。

    【讨论】:

    • 这是你描述的一个很好的谜团:)我将文件扩展名更改为 xlsx(例如上面示例代码中的最后一行),不幸的是文件无法在 Excel 中打开,出现警告: Excel 无法打开文件 test.xlsx,因为文件格式或文件扩展名无效。验证文件没有损坏并且文件扩展名与文件的格式匹配。再次在其他办公工具(如 WPS)中打开它没有问题,只有这个 MS Excel..
    • 我通过将扩展名从 xslx 更改为 zip 进行测试,并查看内部结构。我发现 sharedStrings.xml 只包含来自单元格的数据。这是个好消息 ;) 所以我可以在 Excel 中准备带有格式化单元格的模板,并作为“解压缩”文件夹上传到服务器,然后只需更改一个 xml 文件中的数据。挑战可能是将文件夹的所有部分压缩成一个部分。标准库可能不可能,所以我需要挖掘一些 zip 库 或类似的东西。
    • 好吧,外部库 CarlosAg.ExcelXmlWriter 完全符合您的建议。那么,也许您继续使用该库,并使用您的基本文件模板想法,添加到它,然后它应该可以工作?换句话说,您完全可以按照您的想法/道路,直接修改 xml,但 CarlosAg.ExcelXmlWriter 的整个想法是为您完成所有这些工作。所以考虑两者 - (你的空白预制模板),然后使用 CarlosAg.ExcelXmlWriter 完成繁重的部分。
    • 我用 CarlosAg.ExcelXmlWriter 做了很多工作,我真的很想继续,但是这个库仍然警告我 文件的格式与扩展名不同。此外,当我在代码中打开工作簿功能时 (Workbook.Open("MyTemplate") 它只打开 .xls 版本,使用 .xlsx 它给我一个错误,例如 根级别的数据无效。第 1 行,位置1. 即使我将模板打开为 .xls 并另存为 .xlsx,仍然会提示我有关不同格式的警告。
    • 所以我想也许我应该放弃 CarlosAg.ExcelXmlWriter 库,后退两步,尝试使用 ClosedXML 或其他东西,或者通过使用模板作为解压文件并仅在共享字符串.xml。但在那种情况下,无论如何我都需要外部库来将文件打包成 zip,因为我在原始 asp.net 函数中看不到 zip 函数(最后将扩展名更改为 xlsx 并推送到客户端)。
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多