Excel列番号のアルファベットと数値の相互変換(Java実装)

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メソッドでは、繰り返し割り算を行いながら文字を前方に追加していくことで、正しい順序のラベルを生成しています。

タグ: Java Excel Apache POI データ変換 文字列処理

10月26日 13:46 投稿