この前、エクセル列名から、位置をもとめたのでその逆をやってみます。 2014/01/30

Javaです。この前、エクセル列名から、位置をもとめたのでその逆をやってみます。

結果
1
2
26
27
256
16384
=============
A
B
AA
IV
XFD




以下ソースコードです。再帰させてます。

public class Testshinsu { public static void main(String[] args) { System.out.println(pos("A")); System.out.println(pos("B")); System.out.println(pos("Z")); System.out.println(pos("AA")); // Excel 2003の最大列数 256 System.out.println(pos("IV")); // Excel 2007以降の最大列数 16384 System.out.println(pos("XFD")); System.out.println("============="); System.out.println(rpos(pos("A") - 1)); System.out.println(rpos(pos("B") - 1)); System.out.println(rpos(pos("AA") - 1)); System.out.println(rpos(pos("IV") - 1)); System.out.println(rpos(pos("XFD") - 1)); } static int pos(String s) { String s1 = s.toUpperCase(); char[] cs = s1.toCharArray(); int p = 0; for (int i = 0; i < cs.length; i++) { int c = (int) cs[i] - 64; p += Math.pow(26, cs.length - (i + 1)) * c; } return p; } /** * 列数から、エクセル列名を生成する。 0スタートであることに注意してください。 * * @param p * @return */ static String rpos(final int p) { StringBuilder builder = new StringBuilder(); rpos_(builder, p); return builder.toString(); } // 内部再帰用 static void rpos_(StringBuilder builder, final int p) { final char A = 'A'; int a = p / 26; int b = p % 26; builder.insert(0, (char) (A + b)); if (!(0 < a)) return; rpos_(builder, a - 1); } }


昔、自分が書いたコードの意味がわからない.... はははあは

: