将JavaScript转换为Ruby,将Excel数据拆分为二维变量

时间:2016-11-06 14:49:21

标签: javascript ruby-on-rails ruby excel

以下是用于分割副本和JavaScript的JavaScript粘贴Excel数据。我的目的是将给定的Excel数据拆分到每个单元格中,并在HTML端重用它们。我的问题是我能用Javascript编写它,但我在Ruby中重写它时遇到了麻烦。我需要一些帮助。

这是我的JavaScript:

var data = $('textarea[name=excel_data]').val();
console.log(data);
var rows = data.split("\n");
var l = rows.length - 3;
console.log(l);
var table = $('<table class="table table-bordered" />');
var datas = new Array();
for(var y in rows) {
  var cells = rows[y].split("\t");
  var row = $('<tr />');
  datas[y] = new Array();
  for(var x in cells) {
    row.append('<td id='+y+x+'>'+cells[x]+'</td>');
    datas[y][x] = cells[x];
    $('#excel_table_a'+l+'_'+y+x).html(datas[y][x]);
    $('#excel_table_b'+l+'_'+y+x).html(datas[y][x]);
    $('#excel_table_c'+l+'_'+y+x).html(datas[y][x]);
    $('#excel_table_d'+l+'_'+y+x).html(datas[y][x]);
    $('#excel_table_e'+l+'_'+y+x).html(datas[y][x]);
    $('#excel_table_z'+l+'_'+y+x).html(datas[y][x]);
  } //data generate
  table.append(row);
}

这是我在Ruby中的尝试:

data = @bindo.bindo_input
rows = data.split("\n")
length = rows.length - 3
@datas = Array.new
cells = Array.new { }
rows.length.each do |y|
  cells << rows[y].split("\t")
  @datas[y] = Array.new
  cells.length.each do |x|
    @datas[y][x] = cells[x]
  end
end

当我尝试在Rails上运行此代码时,我收到如下错误消息:

  

未定义的方法`每个&#39; 7:Fixnum

如果有任何帮助,我将非常感谢你。

1 个答案:

答案 0 :(得分:0)

rows.length会返回一个数字。

each是在Range,Enumerable,Hash和Array上定义的方法(可能是其他方法,但不是整数)。

您尝试做的事情(迭代rows.length次)可以通过以下任何方式完成:

# Enumerator#times
rows.length.times do |i|

# Enumerator#times + each
rows.length.times.each do |i|

# Range#each
0.upto(rows.length - 1).each do |i|

# another Range#each
(0..(rows.length - 1)).each do |i|

# Array#each
Array.new(rows.length).each do |i|

关于你的代码的另一个注意事项:你正在使用Array.new来构建很好的数组,尽管你也可以简单地使用[]cells = Array.new {}中的括号没有做任何事情。可以将块传递给Array.new构造函数,但您似乎并未将其用于正确的目的。见Ruby array creation, Array.new vs []

另外,做一点重构:

rows = @bindo.bindo_input.split("\n")
corrected_rows_length = rows.length - 3

@datas = []
cells = []

corrected_rows_length.times do |y|
  cells << rows[y].split("\t")
  @datas[y] = []
  cells.length.times do |x|
    @datas[y][x] = cells[x]
  end
end