我們知道,在 Excel 中,行數用數字表示,而列數是用字母表示的(如下圖所示),有時候需要把它轉換成數字來使用,或者把數字轉換成字母。(例如使用POI操作Excel)
下面是轉換代碼,用來進行字母和數字之間的轉換:
/** * 將以字母表示的Excel列數轉換成數字表示 * * @author WuQianLing * @param letter * 以字母表示的列數,不能為空且只允許包含字母字符 * @return 返回轉換的數字,轉換失敗返回-1 */ public static int letterToNumber(String letter) { // 檢查字符串是否為空 if (letter == null || letter.isEmpty()) { return -1; } String upperLetter = letter.toUpperCase(); // 轉為大寫字符串 if (!upperLetter.matches("[A-Z]+")) { // 檢查是否符合,不能包含非字母字符 return -1; } long num = 0; // 存放結果數值 long base = 1; // 從字符串尾部開始向頭部轉換 for (int i = upperLetter.length() - 1; i >= 0; i--) { char ch = upperLetter.charAt(i); num += (ch - 'A' + 1) * base; base *= 26; if (num > Integer.MAX_VALUE) { // 防止內存溢出 return -1; } } return (int) num; } /** * 將數字轉換成以字母表示的Excel列數 * * @author WuQianLing * @param num * 表示列數的數字 * @return 返回轉換的字母字符串,轉換失敗返回null */ public static String numberToLetter(int num) { if (num <= 0) { // 檢測列數是否正確 return null; } StringBuffer letter = new StringBuffer(); do { --num; int mod = num % 26; // 取余 letter.append((char) (mod + 'A')); // 組裝字符串 num = (num - mod) / 26; // 計算剩下值 } while (num > 0); return letter.reverse().toString(); // 返回反轉后的字符串 }
測試類:
/** * 測試 */ public class Demo { public static void main(String[] args) { System.out.println(ExcelUtil.letterToNumber("A")); System.out.println(ExcelUtil.letterToNumber("b")); System.out.println(ExcelUtil.letterToNumber("Z")); System.out.println(ExcelUtil.letterToNumber("aB")); System.out.println(ExcelUtil.letterToNumber("ABC")); System.out.println(ExcelUtil.numberToLetter(1)); System.out.println(ExcelUtil.numberToLetter(2)); System.out.println(ExcelUtil.numberToLetter(26)); System.out.println(ExcelUtil.numberToLetter(28)); System.out.println(ExcelUtil.numberToLetter(731)); } }
測試執行的結果:
1
2
26
28
731
A
B
Z
AB
ABC