transformation between Excel column name and column number.

def toNum(col:String):Int = {
  def alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  def char2num(c:Char):Int = alpha.indexOf(c) + 1
  def digit(n:Int): Stream[Int] = Stream.cons(n,digit(n*26))

  val nums = col.reverse.map(char2num)
  val zipped = nums.zip(digit(1))
  zipped.foldLeft(0)((sum,elem) => sum + (elem._1 * elem._2))
}

def toStr(num:Int):String = {
  val alpha = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  def encode(n:Int):Int = {
    val n = num % 26
    n match {
      case 0 => 26
      case _ => n
    }
  }
  val encoded = encode(num)

  num match {
    case num if (num <= 0) => ""
    case num if (num == encoded) => alpha(encoded).toString
    case _ => toStr((num - encoded)/ 26) + alpha(encoded).toString
  }
}

// test code
(1 to 65535).map(n => n == toNum(toStr(n))).forall(n => n)