Railscasts第362集 – 导出到Excel:如何避免Excel 2010在打开文件时给出的警告信息?

当使用Ryan Bates的Railscasts Episode#362的示例应用程序导出到Excel( https://github.com/railscasts/362-exporting-csv-and-excel )时,我注意到了Excel 2010(这是Windows)在打开使用“下载为Excel”链接下载的.xls文件时给了我一个警告消息。

警告说:

“正在尝试打开的文件…的格式与文件扩展名指定的格式不同,在打开文件之前,确认文件没有损坏,并且来自可靠的源文件。是否要立即打开文件? “

当我点击“是”时,我可以打开文件。 在使用Excel 2011(在Mac上)时,我甚至不会收到警告消息。 但我希望能够提供一个Excel文件,当用户从我的网站下载这样的文件时,不会提示该警告。

注意:我也尝试将应用程序中的所有引用从.xlsreplace为.xlsx,但是Excel根本无法打开文件。 它抱怨说:“Excel无法打开这个文件,文件格式或文件扩展名无效,请确认文件没有被破坏,文件的扩展名与文件格式相匹配。

我知道像AXLSX( https://github.com/randym/axlsx )这样的gem,但希望我可以使用Railscasts方法,并快速修复以消除Excel 2010中的警告消息。

非常感谢你的帮助!

由Railscasts应用程序生成的xls文件实际上是一个旧的Excel 2003 XML格式的XML文件。

最近版本的Excel有一个名为Extension Hardening的function,当文件格式与文件扩展名不匹配时会生成此警告:

此警报是Excel 2007中名为“扩展强化”的新安全function,可确保打开的文件内容与尝试打开文件的shell命令中指定的扩展types相匹配。 由于上面列出的MIMEtypes与.XLS扩展名相关联,因此文件必须处于XLS(BIFF8)文件格式才能在没有此警告提示的情况下打开。

为了避免这种警告,您将不得不以与文件扩展名匹配的格式生成Excel文件。 在上面的链接中build议作为解决方法编辑registry可能在实践中不可行。 改变扩展到XML也可能工作。

作为xls的可选项 writeexcel ,xlsx和AXLSX的write_xlsx(上面提到的)是很好的select。

其实这个代码生成了:

<?xml version="1.0"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Worksheet ss:Name="Sheet1"> <Table> <Row> <Cell><Data ss:Type="String">ID</Data></Cell> <Cell><Data ss:Type="String">Name</Data></Cell> <Cell><Data ss:Type="String">Release Date</Data></Cell> <Cell><Data ss:Type="String">Price</Data></Cell> </Row> <% @products.each do |product| %> <Row> <Cell><Data ss:Type="Number"><%= product.id %></Data></Cell> <Cell><Data ss:Type="String"><%= product.name %></Data></Cell> <Cell><Data ss:Type="String"><%= product.released_on %></Data></Cell> <Cell><Data ss:Type="Number"><%= product.price %></Data></Cell> </Row> <% end %> </Table> </Worksheet> </Workbook> 

是XML(XLS是一种二进制格式,XLST是一种压缩格式)

将文件重命名为.xml应该可以工作