Excel セル位置を文字列 (“A1”) ⇔ 数値 ([R,C]) 変換するワンライナー
*この記事は Qiita から移行した内容です。
roo でスプレッドシートを扱うときに使った。
文字列から数値に変換
cell_addr
に文字列を入れて実行すると行番号と列番号が取れる。
[cell_addr[/\d+/].to_i,cell_addr[/[A-Z]+/].chars.inject(0){|a,b|a*26+('A'..'Z').find_index(b)+1}]
メソッド化して使うとこんな感じ。
def cell_addr_str_to_num(cell_addr)
[cell_addr[/\d+/].to_i,cell_addr[/[A-Z]+/].chars.inject(0){|a,b|a*26+('A'..'Z').find_index(b)+1}]
end
cell_addr_str_to_num("A1") # => [ 1, 1]
cell_addr_str_to_num("AB12") # => [12, 28]
# 行番号と列番号を別々に取るとき
row, col = cell_addr_str_to_num("B3")
row # => 3
col # => 2
数値から文字列に変換
row
, col
に数値を入れて実行すると文字列が取れる。
col.to_s(26).chars.map{|a|('A'..'Z').to_a[a.to_i(26)-1]}.join+row.to_s
メソッド化して使うとこんな感じ。
def cell_addr_num_to_str(row, col)
col.to_s(26).chars.map{|a|('A'..'Z').to_a[a.to_i(26)-1]}.join+row.to_s
end
cell_addr_num_to_str(1, 1) # => "A1"
cell_addr_num_to_str(12, 28) # => "AB12"
# 行番号と列番号を配列で渡すとき
addr = [3, 2]
cell_addr_num_to_str(*addr) # => "B3"