この前、エクセル列名から、位置をもとめたのでその逆をやってみます。
2014/01/30
java
エクセル
再帰
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);
}
}
昔、自分が書いたコードの意味がわからない.... はははあは
: