日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

Excel 列名への変換

ググると割と巷にコードサンプルが見つかるものの Clojure は見つからなかったので作ってみた。

(defn num->col-name [n]
  "1以上の数値からExcelの列名表記に変換する"
  (letfn [(charseq [x]
            (when (pos? x)
              (cons (mod (dec x) 26) (charseq (quot (dec x) 26)))))]
    (->> (charseq n)
         (map (comp char (partial + 65)))
         reverse
         (apply str))))

こんな感じ。

user> (num->col-name 0)
""
user> (num->col-name 1)
"A"
user> (num->col-name 26)
"Z"
user> (num->col-name 27)
"AA"
user> (num->col-name 256)
"IV"
user> (num->col-name 16384)
"XFD"

うん、Excel2007 までは対応できそう。
0以下が空文字になるのはご愛嬌。

Clojureの無限シーケンスでいくらでも作れちゃう。

user> (take 100000 (map num->col-name (iterate inc 1)))
("A" "B" "C" "D" ...(中略)..."EQWZ" "EQXA" "EQXB" "EQXC" "EQXD")

まだ Excel2010 でもここまで表示しないがw
Excel2013 はどうなんだろ。