Java将Excel的列数以字母表示的字符串转换成数字表示
我们知道,在 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