2012-10-11 116 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