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

18

我有一个网页链接到一个Excel 2007工作表,是一个 .xls 格式的文件而不是 .xlsx 文件。当我点击链接时,出现通常的对话框,可以选择打开或保存Excel文件。在点击“打开”后,会出现以下警告消息:

您正在尝试打开的文件 'filename.xls' 的格式与文件扩展名指定的格式不同。在打开文件之前,请验证该文件未损坏并来自可信任的来源。是否要立即打开文件?

我能否通过编程方式抑制此警告消息(即隐藏它或防止其出现)?我正在使用 ColdFusion 进行 Web 开发。


为什么不直接将扩展名保留为.XLSX呢? - ceejayoz
1
这是针对一个特定的XLS文件,还是您尝试的每个XLS文件?您是否考虑过可能存在问题的那个文件实际上已经损坏了?如果是每个XLS文件,那么听起来像是Excel / Windows选项,您无法从ColdFusion(或任何其他服务器端语言)控制用户计算机上的选项。 - Adam Tuttle
3
Adam,这是一个新的Excel“特性”- 以前你可以简单地生成CSV文件或HTML表并将其命名为XLS,但现在每次打开文件时会弹出一个愚蠢的对话框(除非个别客户端禁用它)。 - Peter Boughton
你可以尝试使用SheetJS,参考我的答案这里 - Kevin Ng
8个回答

20

如果您不想寻找解决方案,只是想解决问题,请将以下密钥插入您的注册表以禁止通知:

[HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security] “ExtensionHardening”=dword:00000000

您可以通过以下步骤完成上述操作:

  1. 打开注册表(开始 -> 运行 -> regedit.exe)
  2. 导航到 HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\12.0\EXCEL\SECURITY
  3. 右键单击右侧窗口,选择“新建” -> “DWORD”
  4. 将名称设置为“ExtensionHardening”(不包括引号)
  5. 验证数据值为“0”

谢谢Jon。我能用ColdFusion编程来实现这个吗? - Arnkrishn
6
我的解决方法只适用于单个本地计算机。据我所知,Web应用程序无法编辑注册表。 - jgallant

12

这个问题是由一个名为“扩展硬化”的功能所导致的,您可以在这里找到更多相关信息。

我在我的项目中经常遇到这个问题,像Jon说的那样,关闭扩展硬化是每个客户端用户都必须要做的事情。

不幸的是,上面的链接还指出,直到至少Office 14,这段代码不会有任何预期的变化。


2
我认为这仅适用于使用CSV并另存为XLS的情况。但是,如果您构建了一个真正的Excel文件,那么应该没问题。CF9 cfspreadsheet将成为您的好朋友。 :) - Henry
我同意 @Henry 的看法,当我尝试使用 FileWriter 类在 Java 中导出 JTable 并打开 .xls 文件时,遇到了此警告消息。 - Mr. Xymon

2

对于旧的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有关。 - Boris

0
如果您没有指定文件扩展名,那么它很可能会被命名为.cfm文件,并且内容类型为“application/vnd-excel”,这会导致警告的出现。
在文件输出开始之前尝试添加以下内容:
<cfheader name="Content-Disposition" value="attachment;filename=myexcelfile.xls">
<cfcontent type="application/ms-excel" reset="true">

0

我不相信你可以从用户那里隐藏它。这些警告是外部于你的浏览器。


0
该消息表明文件内容和文件扩展名不匹配。因此,它可能是XLSX文件,或者服务器上的当前文件以某种方式损坏。建议尝试使用ZIP工具打开文件。如果可以打开,则确实是XLSX格式文件。然后,您可以通过重命名文件来修复警告。
如果不是这种情况,则文件发生了某些问题。
但无论如何,抑制警告并不是解决问题的方法。下一次病毒出现并要求您的客户打开“nakedgrls.gif.exe”时,最好不要更改安全设置。

0
如果您正在使用方便的cfcontent技巧来输出Excel文件,请考虑使用cfx_query2excel,它将编写真正的Excel文件,这应该可以帮助您解决问题。它是一个Java库,值得一试。
祝您好运。

0

我曾经遇到过同样的问题,客户也对此进行了抱怨。我进行了大量的谷歌搜索,但没有找到解决方法。最终,我使用cfspreadsheet创建了电子表格,我知道这需要比直接通过HTML创建更多的工作,但它可以消除警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接