ColdFusion:如何在不将其保存为文件的情况下生成电子表格?

时间:2016-07-27 13:59:18

标签: excel coldfusion coldfusion-11

在ColdFusion应用程序中,我需要让用户将电子表格保存到硬盘中。

我已经能够动态生成文件,方法是将它们构建为XML或HTML表格,应用application/vnd.ms-excel MIME类型,并使用.xls扩展名保存它们。

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

但是当用户加载这样的文件时,他们总是会收到恼人的消息(由于Excel's Extension Hardening Feature):

  

您尝试打开的文件&#39; _____。xls&#39;,格式与文件扩展名指定的格式不同。在打开文件之前,请验证文件是否已损坏且是否来自受信任的源。你想现在打开文件吗?

我宁愿避免这条消息。

我理解<cfspreadsheet>标记和SpreadsheetWrite()函数会生成一个不显示此消息的正确Excel文件 - 但它们都需要一个参数来指示服务器上文件的写入位置。因为下载可能包含敏感信息,并且因为一旦将文件写入服务器后我就无法轻松实施安全性,所以我不想创建这样的文件 - 即使是暂时的。 (我知道我可以提供密码,但这不是生成Excel文件后将使用的业务流程环境中的理想解决方案。)

如何生成Excel文件并提示下载而不首先将其写入文件?

1 个答案:

答案 0 :(得分:6)

在为此问题搜索Stack Overflow和其他资源之后,我终于在另一个问题的上下文中找到了解决方案。我现在在这里发布问题和我的发现,希望其他人比我更容易找到这些信息。

解决方案围绕SpreadsheetReadBinary()标记中的variable函数和<cfcontent>属性。

我使用ColdFusion spreadsheet functions构建了一个电子表格,然后将以下内容放在文件的 end 上(这与我放置<cfheader>和{{1}的习惯相反在开头)。

<cfcontent>

如果有人会从更多细节中受益,<cfheader name="Content-Disposition" value="attachment; filename=MySpreadsheet.xls"> <cfcontent type="application/vnd.ms-excel" variable="#SpreadsheetReadBinary( objSpreadsheet )#"> 文件中的以下内容将构建电子表格并提示下载为正确格式的Excel文件:

.cfm