在Ruby中将Excel列字母转换为整数

7

将类似Excel列字母转换为整数的最简单方法是什么?

例如:

AB --> 27
AA --> 26
A --> 0
Z --> 25
5个回答

13
def excel_col_index( str )
  value = Hash[ ('A'..'Z').map.with_index.to_a ]
  str.chars.inject(0){ |x,c| x*26 + value[c] + 1 } - 1
end

或者

def excel_col_index( str )
  offset = 'A'.ord - 1
  str.chars.inject(0){ |x,c| x*26 + c.ord - offset } - 1
end

我认为第二个很漂亮 :3 - Kokizzu
这两个都需要减去 1 才能得到正确的答案。它们分别返回 "A" 的值为 1,"AA" 的值为 27。 - Br.Bill
1
这对小写字母不起作用 (excel_col_index('b') #=> 34)。如果你需要改变它,可以使用...str.upcase.chars.inject... - Arye Eidelman
1
@Br.Bill 很好的发现 - 我已经编辑了答案,加上了所需的 -1,并在下面添加了一个规范作为单独的答案。 - Tim Diggins

5
我会这样做:
def column_name_to_number(column_name)
  multipliers = ('A'..'Z').to_a
  chars = column_name.split('')

  chars.inject(-1) { |n, c| multipliers.index(c) + (n + 1) * 26 }
end

3

以下是被接受答案的版本,带有规范:

RSpec.describe "#excel_col_index" do
  def excel_col_index(str)
    value = Hash[('A'..'Z').map.with_index.to_a]
    str.chars.inject(0) { |x, c| x * 26 + value[c] + 1 } - 1
  end

  { "A" => 0, "Z" => 25, "AB" => 27, "AA" => 26 }.each do |col, index|
    it "generates #{index} from #{col}" do
      expect(excel_col_index(col)).to eq(index)
    end
  end
end

(但我也会编辑已接受的答案以符合所需的 - 1

2
啊,没事了。
def cell2num col
  val = 0
  while col.length > 0
    val *= 26
    val += (col[0].ord - 'A'.ord + 1)
    col = col[1..-1]
  end
  return val - 1
end

1
这是一个可以反复修改的部分,你可以花很长时间来完善它。最终我得到了这个结果:
"AB1".each_codepoint.reduce(0) do |sum, n|
  break sum - 1 if n < 'A'.ord  # reached a number
  sum * 26 + (n - 'A'.ord + 1)
end # => 27

xsv 的源代码中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接