我正在为我的模型 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 文件?我一直在做的事情显然是行不通的。