如何在 Excel 下载时抑制文件损坏警告?

Posted

技术标签:

【中文标题】如何在 Excel 下载时抑制文件损坏警告?【英文标题】:How to suppress the file corrupt warning at Excel download? 【发布时间】:2010-10-30 17:10:37 【问题描述】:

我有一个链接到 Excel 2007 工作表的网页。这是一个.xls 文件,而不是.xlsx 文件。当我单击链接时,我会看到通常的对话框来打开/保存 Excel 文件。单击“打开”时,我收到以下警告消息-

您尝试打开的文件, 'filename.xls' 在不同的 比文件指定的格式 延期。确认文件不是 已损坏且来自受信任的来源 在打开文件之前。你想要 现在打开文件?

我能否以编程方式抑制此警告消息(即隐藏它或阻止它显示?)我正在使用 ColdFusion 进行 Web 开发。

【问题讨论】:

为什么不将扩展名保留为 .XLSX? 这是针对一个特定的 XLS 文件,还是针对您尝试的每个 XLS 文件?您是否考虑过相关文件实际上可能已损坏的可能性?如果是每个 XLS 文件,那么它听起来像是一个 Excel/Windows 选项,您无法通过 ColdFusion(或任何其他服务器端语言)在用户计算机上控制它。 亚当,这是一个新的 Excel '功能' - 之前你可以简单地生成一个 CSV 文件或 html 表并将其命名为 XLS,但现在每次打开文件时都会出现一个愚蠢的对话框(除非个别客户禁用它)。 你可以尝试使用SheetJS,参考我的回答here。 【参考方案1】:

我不相信您可以对用户隐藏它。这些类型的警告在您的浏览器之外。

【讨论】:

【参考方案2】:

如果您不想寻找解决方案,而只是想解决问题,请在您的注册表中插入此键以禁止通知:

[HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security] “扩展强化”=dword:00000000

您可以通过执行以下操作来完成上述操作:

    打开您的注册表(开始 -> 运行 -> regedit.exe) 导航到 HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\12.0\EXCEL\SECURITY 在右侧窗口中右键单击并选择新建 -> DWORD 键入“ExtensionHardening”作为名称(不带引号) 验证数据的值为“0”

【讨论】:

谢谢乔恩。我可以以编程方式执行此操作,例如使用冷融合吗? 我的解决方法是针对单个本地计算机。据我所知,网络应用程序将无法编辑注册表。【参考方案3】:

这个问题是由一个叫做扩展强化的特性引起的,你可以找到更多关于它的信息here

我在项目中经常遇到这个问题,正如 Jon 所说,关闭扩展强化是每个客户端用户都必须完成的事情。

不幸的是,上面的链接还指出,至少在 Office 14 之前,此代码不会发生预期变化。

【讨论】:

我认为这仅适用于您使用 CSV 并另存为 XLS 的情况。但是,如果你构建一个真正的 excel 文件,那么它应该没问题。 CF9 cfspreadsheet 将成为您的朋友。 :) 我同意@Henry,我刚刚在尝试使用 FileWriter 类打开从 Java 中的 JTable 导出的 .xls 文件时遇到此警告消息。【参考方案4】:

消息表明文件内容和文件扩展名不匹配。因此,要么是 XLSX 文件,要么服务器上的当前文件以某种方式损坏。我建议尝试使用 ZIP 工具打开文件。如果可行,它实际上是一个 XLSX 格式的文件。然后您可以通过重命名文件来修复警告。

如果不是这样,文件出了问题。

但无论哪种方式,抑制警告都不能解决您的问题。下次病毒出现并要求您的客户打开 nakedgrls.gif.exe 时,您最好不要弄乱安全设置。

【讨论】:

【参考方案5】:

如果您使用方便的 cfcontent 技巧来输出为 excel 文件,请考虑使用 cfx_query2excel,它会编写真正的 excel 文件,可以帮助您解决这个问题。这是一个 Java 库,值得。

祝你好运。

【讨论】:

【参考方案6】:

如果您没有指定文件扩展名,它可能会被命名为内容类型为“application/vnd-excel”的 .cfm 文件,从而导致此警告。

尝试在文件输出开始之前添加:

<cfheader name="Content-Disposition" value="attachment;filename=myexcelfile.xls">
<cfcontent type="application/ms-excel" reset="true">

【讨论】:

【参考方案7】:

我遇到了同样的问题,客户抱怨它。我做了很多谷歌搜索,但没有运气。最后我使用 cfspreadsheet 创建了电子表格,我知道它需要额外的工作而不是直接通过 HTML 创建,但它删除了警告。

【讨论】:

【参考方案8】:

对于旧的 Excel 格式 (.xls)

假设您使用以下语法创建电子表格对象:

<cfset sheet = SpreadsheetNew() /> 

您将使用它来创建下载:

<cfheader name="content-disposition" value="attachment;filename=my_spreadsheet.xls">
<cfcontent type="application/vnd.ms-excel" variable="#spreadsheetReadBinary(sheet)#" reset="true">

对于较新的 Excel 格式 (.xlsx)

使用以下语法创建电子表格对象:

<cfset sheet = SpreadsheetNew("", "true") />

并使用它来创建下载:

<cfheader name="content-disposition" value="attachment;filename=my_xml_spreadsheet.xlsx">
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" variable="#spreadsheetReadBinary(sheet)#" reset="true">

感谢Raymond Camden 提供的大部分内容(他的示例是用旧格式创建电子表格——我更新了新格式并使用了稍微不同的 MIME 值)。

【讨论】:

虽然这适用于我的 CF9 服务器,但不适用于 CF11。它说,由于文件格式或文件尾端无效,文件无法打开。 CF11还有别的吗?我必须在服务器上安装 OpenOffice 吗?当将文件作为电子邮件附件发送时,它可以工作。可能与 IIS 有关。

以上是关于如何在 Excel 下载时抑制文件损坏警告?的主要内容,如果未能解决你的问题,请参考以下文章

抑制 MS Access Excel 警告/错误

如何抑制更新链接警告?

Webapi 导出到 excel 下载的损坏文件

下载时文件损坏

代码生成器生成文件的代码分析 - 如何抑制警告?

PHP强制下载.xlsx文件损坏