2012-10-11 49 views
0

我跟着这个Railscasts link for CSV export from Rails到我的HTML表(动态生成的)出口到XLS和它下载我的Excel文档时,我做的.xlsExcel和Ruby的兼容性

然而,当我在iWork的号码打开它,我得到的以下错误:

导入警告 - 这是制表符分隔的文档,而不是有效的Excel文档。数据可能看起来不同。

我在文档中看到了我的表格源代码。

这里是我用来生成表的代码:

<table border ="1"> 
     <tr>enter code here 
    <th><%= get_column_name "#{@level1}"%></th> 
    <th><%= get_column_name "#{@level2}"%></th> 
    <th><%= get_column_name "#{@level3}"%></th> 
    <th>abcd</th> 
    </tr> 
     <% @grp.each do |key, value| %> 
      <% value.each do |k2, v2|%> 
       <% v2.each do |k3, v3|%> 
         <tr> 
          <td><% if "#{@level1}" == "abcd" && Person.exists?(key.to_i) %><%= "#{Person.find(key.to_i).get_name}" %><% else %><%= "#{key}" %><% end %></td> 
          <td><% if "#{@level2}" == "abcd" && Person.exists?(k2.to_i) %><%= "#{Person.find(k2.to_i).get_name}" %><% else %><%= "#{k2}" %><% end %></td> 
          <td><% if "#{@level3}" == "abcd" && Person.exists?(k3.to_i) %><%= "#{Person.find(k3.to_i).get_name}" %><% else %><%= "#{k3}" %><% end %></td> 
          <td><%= "#{v3.count}" if !v3.nil? %></td> 
         </tr> 
       <%end%> 
      <%end%> 
     <%end%> 
</table> 

有人可以告诉我,如果它是用数字或别的东西的问题。我是一名学生,无法真正负担购买excel只是为了检查这一点。

最佳,

+0

任何代码?你如何编写你的xls文档? – halfelf

+0

嗨@halfelf,我用我的代码更新了描述。 – anipendakur

+1

我认为这可能只是一个数字问题。但是,您应该考虑制作CSV或TSV,而不是依赖Excel的HTML->电子表格功能,因此您可以实际查看电子表格(以及其他不使用Excel的用户)。这也很容易 - 只需要有效的TSV行,就可以使用<%= row.join(“\ t”)%>'。 – jmdeldin

回答

1

较为简单的方法是只生成CSV或TSV(制表符分隔)文件。如果你没有Excel,并且你不需要处理XLS的恐怖[X],这绝对是一个好主意。

您链接到的Railscast给出了一个使用CSV库的解决方案。它为您处理引用字段,这非常好,因为我们稍后会看到。我将概述手动方法,以及:

让我们假设你在你的控制器,这个动作:

# widget_controller.rb 
def index 
    @widgets = Widget.ordered_by_name 
    respond_to do |format| 
    format.csv 
    end 
end 

然后像这样在你的模板将工作:

<%# index.csv.erb %> 
ID,Name 
<% @widgets.each do |w| %> 
<%= w.id %>,<%= w.name %> 
<% end %> 

或者更简洁:

<%# index.csv.erb %> 
<%= %w(ID Name).join(",") %> 
<%= @widgets.map { |w| [w.id, w.name].join(",") }.join("\n") %> 

您需要注意引用。举例来说,如果widgets[0].name返回foo,bar,你的数据会看起来像:

ID,Name 
1,foo,bar 
2,baz 

的解决方法就是引用字段,或者如果你不想考虑这个...使用CSV.generate :)。

+0

谢谢你的回复。但是,每次页面加载/刷新时,我都会有一个动态生成的散列。 但是我得到了照片。我必须渲染CSV中的视图,将散列作为参数传递;最后在加入之前引用这些字段。我会尝试一下,看看它是否可以在iWork Numbers中使用。 谢谢:) – anipendakur