通过Excel列号取得其对应的列字母

在编程中,我们常常利用POI或者其他接口操作Excel文件。当通过列号写公式时,很麻烦。因为Excel公式中,使用列字母形式表示单元格。比如:SUM(B1:B5),下面的方法可以通过Excel列号取得其对应的列字母。这样通过循环列号,得到对应的列字母就可以方便的进行操作不同列了。下面是实现代码。

Java实现

/**
 * 获取一列对应的字母。例如:ColumnNum=1,则返回值为A 列号转字母
 */
private String getColumnName(int columnNum) {
	int first;
	int last;
	String result = "";
	if (columnNum > 256)
		columnNum = 256;
	first = columnNum / 27;
	last = columnNum - (first * 26);

	if (first > 0)
		result = String.valueOf((char) (first + 64));

	if (last > 0)
		result = result + String.valueOf((char) (last + 64));

	return result;
}

VBA实现

'获取一列对应的字母
'例如:ColumnNum=1,则返回值为A
'列号转字母
Function getColumnName(ByVal ColumnNum As Integer) As String
    Dim First As Integer, Last As Integer
    Dim Result As String
    If ColumnNum > 256 Then ColumnNum = 256
    First = Int(ColumnNum / 27)
    Last = ColumnNum - (First * 26)

    If First > 0 Then
        Result = Chr(First + 64)
    End If
    If Last > 0 Then
        Result = Result & Chr(Last + 64)
    End If
    GetColumnName = Result
End Function

2013/08/20 更新 以上方法只适用于Excel2003,以下方法可以兼容Excel2003,2007,2010,并且增加了将Excel表格中列号字母转成列索引方法

Java实现

/**
 * 用于将Excel表格中列号字母转成列索引,从1对应A开始
 * 
 * @param column
 *            列号
 * @return 列索引
 */
private static int columnToIndex(String column) {
	if (!column.matches("[A-Z]+")) {
		try {
			throw new Exception("Invalid parameter");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	int index = 0;
	char[] chars = column.toUpperCase().toCharArray();
	for (int i = 0; i < chars.length; i++) {
		index += ((int) chars[i] - (int) 'A' + 1)
				* (int) Math.pow(26, chars.length - i - 1);
	}
	return index;
}

/**
 * 用于将excel表格中列索引转成列号字母,从A对应1开始
 * 
 * @param index
 *            列索引
 * @return 列号
 */
private static String indexToColumn(int index) {
	if (index <= 0) { 		try { 			throw new Exception("Invalid parameter"); 		} catch (Exception e) { 			e.printStackTrace(); 		} 	} 	index--; 	String column = ""; 	do { 		if (column.length() > 0) {
			index--;
		}
		column = ((char) (index % 26 + (int) 'A')) + column;
		index = (int) ((index - index % 26) / 26);
	} while (index > 0);
	return column;
}