Excelファイルのインポート・エクスポート処理において、エラー発生時のセル位置をユーザーに正確に通知するためには、列番号を「A」「AA」のようなアルファベット形式と、内部処理用の数値形式との間で変換する必要があります。このようなニーズに対応するためのJavaによる実装例を以下に示します。
public class ExcelColumnConverter {
public static void main(String[] args) {
// アルファベット → 数値の変換テスト
String columnLabel = "AA";
int numericIndex = convertColumnLabelToNumber(columnLabel);
System.out.println("'" + columnLabel + "' の列番号: " + numericIndex);
// 数値 → アルファベットの変換テスト
int index = 26;
String label = convertColumnNumberToLabel(index);
System.out.println(index + " 列目のラベル: " + label);
// 大きな値でのテスト
columnLabel = "AAAA";
numericIndex = convertColumnLabelToNumber(columnLabel);
System.out.println("'" + columnLabel + "' の列番号: " + numericIndex);
index = 466948;
label = convertColumnNumberToLabel(index);
System.out.println(index + " 列目のラベル: " + label);
}
/**
* Excelの列ラベル(例: "AB")を1ベースの数値インデックスに変換
* @param label 変換対象の列ラベル(大文字アルファベット)
* @return 対応する列番号(A=1, B=2, ...)
*/
public static int convertColumnLabelToNumber(String label) {
int result = 0;
int power = 0;
// 右から左へ桁ごとに処理(一の位から順に)
for (int i = label.length() - 1; i >= 0; i--) {
char c = label.charAt(i);
int value = c - 'A' + 1; // A→1, B→2, ..., Z→26
result += value * Math.pow(26, power);
power++;
}
return result;
}
/**
* 1ベースの列番号をExcel列ラベル(例: 27 → "AA")に変換
* @param index 列番号(1以上)
* @return 対応するアルファベット列ラベル
*/
public static String convertColumnNumberToLabel(int index) {
if (index <= 0) {
throw new IllegalArgumentException("列番号は1以上である必要があります");
}
StringBuilder builder = new StringBuilder();
while (index > 0) {
index--; // 0ベースに調整
char letter = (char) ('A' + (index % 26));
builder.insert(0, letter);
index /= 26;
}
return builder.toString();
}
}
出力結果
'AA' の列番号: 27
26 列目のラベル: Z
'AAAA' の列番号: 18279
466948 列目のラベル: ZNSN
この実装では、Excelの列が持つ26進数的な構造を正しく扱うために、変換時にオフセット調整(A=1)や0ベースへの一時変換を適切に行っています。特にconvertColumnNumberToLabelメソッドでは、繰り返し割り算を行いながら文字を前方に追加していくことで、正しい順序のラベルを生成しています。