19493


KotlinでPOIを使ったプログラミングをしているのですが、その中でセルの座標（x=5、y=4）からセルのラベル（座標は0から開始のためこの場合F3）に変換する効率的なアルゴリズムがないかを知りたいです。

26進法で考えていますが、A〜Zまで来た次がAAのため簡単にできないと思っています。

以下、テストで作成し正しく動くものはできてはいます。ただ、直感的にわかりやすいプログラムではないため、もう少しわかりやすいものができないかと試行錯誤しています。

[code]

    @JvmStatic
    fun cellIndexToCellName(x: Int, y: Int): String {
        var cellName = ""
        var threshold = 26
        var tempX = x
        var loop = 0 // ループの2回目以降は値から1を引く
        while (true) {
            val mod26 = tempX % threshold
            cellName =  (mod26 + 65 - loop).toChar() + cellName
            if (tempX < threshold) {
                break
            }
            tempX = tempX / threshold
            if (loop == 0) {
                loop += 1
            }
       }
       return cellName + (y + 1)
    }
    
[/code]

Kotlinで書いていますが、Java、C、C#等の言語でも構いません。


CC BY-SA 3.0
2015-11-30T19:30:51.473
19485
2015-12-01T03:17:41.907
2214
question
kotlin excel
ExcelのC1R1形式からセルのラベル（A1、C7）形式への変換


参考URLを元にKotlinの場合のコードを書きました。結果的に次のようなコードでうまくいきました。

[code]

    @JvmStatic
    fun cellIndexToCellName(x: Int, y: Int): String {
        var cellName = dec26(x, 0)
        return cellName + (y + 1)
    }
    
    @JvmStatic
    fun dec26(num: Int, first: Int): String {
       return if (num > 25) { dec26(num / 26, 1) } else { "" } + ('A' + (num - first) % 26)
    }
    
[/code]

firstは一種のフラグです。2桁目以上は何もしていないとZの次がBAになってしまうのを防ぐために使っています。

dec26関数の最初の呼び出しの際は0、再帰で呼び出す際は1を渡し、値の調整をしています。


CC BY-SA 3.0
2015-12-01T03:17:41.907
19493
2015-12-01T03:17:41.907
2214
19485
answer