我正在为我的模型WeeklyReport的每个项目生成一个xls文档。我已经掌握了文档的基本结构,但我发现小的更改不断使文件被Excel 2010读取为损坏和无法修复,我真的不明白为什么。我一直在这里使用railscast:http://railscasts.com/episodes/362-exporting-csv-and-excel想办法做到这一点。
在我的模型控制器中,我有以下内容:
def show
@report=WeeklyReport.find(params[:id])
@engagements=@report.engagements
end
def index
@reports=WeeklyReport.all
respond_to do |format|
format.html
format.xls
end
end
在show.xls文件中,我有以下内容:
<?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">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>OurAppName</Author>
<Created><%= @report.created_at%> </Created>
</DocumentProperties>
<Worksheet ss:Name="Engagements">
<Table>
<Row>
<Cell><Data ss:Type="String">First Name</Data></Cell>
<Cell><Data ss:Type="String">Email</Data></Cell>
<Cell><Data ss:Type="String">Date</Data></Cell>
<Cell><Data ss:Type="String">Version</Data></Cell>
<Cell><Data ss:Type="String">Rating</Data></Cell>
<Cell><Data ss:Type="String">Comment</Data></Cell>
</Row>
<% @engagements.each do |e| %>
<Row>
<Cell><Data ss:Type="String"> <%= e.user.first_name%></Data></Cell>
<Cell><Data ss:Type="String"> <%= mail_to("#{e.user.email}")%></Data></Cell>
<Cell><Data ss:Type="String"> <%= e.created_at.strftime("%B %d, %y")%></Data></Cell>
<Cell><Data ss:Type="String"> <%= e.version_made %></Data></Cell>
<Cell><Data ss:Type="String"> <%= e.rating %></Data></Cell>
<Cell><Data ss:Type="String"> <%= e.comment %></Data></Cell>
</Row>
<% end %>
</Table>
</Worksheet>
</Workbook>
我正在努力了解是什么使文件被读取为损坏。我调整了excel中的文档,使其看起来像我想要的样子,然后试图对其进行反向工程。当我只是将xls代码复制并粘贴到应用程序中时(我想在它工作后会回去将其更改为迭代数据),它说文件已损坏。当我进行各种小的更改时,它会显示文件已损坏。以下是导致文件损坏的一些原因:
- 将评级数据单元格类型更改为"数字"
- 复制xml文档中的样式信息,我将excel文件保存为
- 添加列宽信息基本上,我不明白为什么它会使文件损坏,以及是什么导致它们损坏,似乎有一半的时间是无缘无故发生的(显然不是这样)
我希望我们的管理员能够放心地下载这些文件。打开文件时,我还收到一条警告:"您试图打开的文件的格式与文件扩展名指定的格式不同。在打开文件之前,请验证该文件是否已损坏,并且来自受信任的来源。您想现在打开该文件吗?"
我看到的关于处理Excel中未真正损坏的损坏文件的大多数答案都涉及更改受信任文档的保护设置。我认为这不是解决这个问题的合适方案,因为它会降低我们管理员计算机的安全性。
我如何创建安全的(如中所示,对于我们技术水平较低的管理员来说,读起来是可信的,不可怕)、不损坏的xls文件?我所做的显然不起作用。
我在很大程度上弄清楚了为什么会发生这种情况。在我将类型设置为数字的情况下,它已损坏,因为<%= e.rating %>
是一个字符串。即使评级是Integer,嵌入的ruby也会返回一个字符串。我想在剩下的大部分时间里,我并没有完全关闭标签。数字问题是最令人困惑的问题。