【问题标题】:Excel and Ruby compatibilityExcel 和 Ruby 兼容性
【发布时间】:2012-10-11 09:00:36
【问题描述】:

我按照Railscasts link for CSV export from Rails将我的 html 表(动态生成)导出到 xls 并在我执行 .xls 时下载我的 excel 文档

但是,当我在 iWork Numbers 中打开它时,我收到以下错误:

导入警告 - 这是一个制表符分隔的文档,不是有效的 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来看看这个。

最好的,

【问题讨论】:

  • 任何代码?你如何写你的 xls 文档?
  • 嗨@halfelf,我已经用我的代码更新了描述。
  • 我认为这可能只是一个数字问题。但是,您应该考虑制作 CSV 或 TSV,而不是依赖 Excel 的 HTML->电子表格功能,这样您才能真正查看电子表格(以及其他不使用 Excel 的人)。这也很容易做到——&lt;%= row.join("\t") %&gt; 是有效 TSV 行所需的全部内容。
  • 您可以查看用于编写和解析 Excel .xls 数据的现有 gem。这是short list
  • @anipendakur:抱歉耽搁了。我发布了回复以澄清 CSV 并呈现它们。希望对您有所帮助!

标签: ruby-on-rails ruby excel csv railscasts


【解决方案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 :)。

【讨论】:

  • 感谢您的回复。但是,每次加载/刷新页面时,我都会动态生成一个哈希。然而我得到了照片。我必须在 CSV 中呈现视图,将哈希作为参数传递;最后在加入之前引用字段。我会试试这个,看看这是否适用于 iWork Numbers。谢谢你:)
猜你喜欢
  • 2023-03-03
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2022-01-25
  • 2015-01-05
  • 1970-01-01
  • 2016-12-14
相关资源
最近更新 更多