如何将Excel工作表的列名转换为数字?

我想知道什么是最好的方式来将Excel表单列名转换为数字。

我正在使用Excel包 ,一个很好的库来处理.xlsx文件。 这个库不幸的是没有包含这个function。

OBS:第一列A对应于该库中的编号1。

这个函数应该适用于任意长度的列名。

public static int GetColumnNumber(string name) { int number = 0; int pow = 1; for (int i = name.Length - 1; i >= 0; i--) { number += (name[i] - 'A' + 1) * pow; pow *= 26; } return number; } 

几个月前我不得不面对这个问题。 列名称的反列索引也很有趣,如果你试图用零索引来解决索引,而不是意识到这会使事情变得复杂,那么就变得非常混乱。 这可能是如此简单,如果它是一个正常的多元数字系统…

这里是我的解决scheme的简化版本作为扩展方法没有error handling和所有的东西。

 public static Int32 ToOneBasedIndex(this String name) { return name.ToUpper(). Aggregate(0, (column, letter) => 26 * column + letter - 'A' + 1); } 

我一直在这个工作了一段时间,发现这对于超越AZ的列甚至超出AA-ZZ的列是非常有效的……这是通过分解string中的每个字符并recursion地调用它来派生ASCII字符的DEC值(小于64),然后乘以26 ^ n。 当n> 4时,使用long的返回值来克服潜在的限制。

  public long columnNumber(String columnName) { char[] chars = columnName.ToUpper().ToCharArray(); return (long)(Math.Pow(26, chars.Count() - 1)) * (System.Convert.ToInt32(chars[0]) - 64) + ((chars.Count() > 2) ? columnNumber(columnName.Substring(1, columnName.Length - 1)) : ((chars.Count() == 2) ? (System.Convert.ToInt32(chars[chars.Count() - 1]) - 64) : 0)); } 

另外,如果你想得到相反的结果(即通过columnNumber并获得columnName,这里有一些代码适用于此。

  public String columnName(long columnNumber) { StringBuilder retVal = new StringBuilder(); int x = 0; for (int n = (int)(Math.Log(25*(columnNumber + 1))/Math.Log(26)) - 1; n >= 0; n--) { x = (int)((Math.Pow(26,(n + 1)) - 1) / 25 - 1); if (columnNumber > x) retVal.Append(System.Convert.ToChar((int)(((columnNumber - x - 1) / Math.Pow(26, n)) % 26 + 65))); } return retVal.ToString(); } 

试试我的代码

命名空间XLS {

 /// <summary> /// Represents a single cell in a excell sheet /// </summary> public struct Cell { private long row; private long column; private string columnAddress; private string address; private bool dataChange; /// <summary> /// Initializes a new instance of the XLS.Cell /// class with the specified row and column of excel worksheet /// </summary> /// <param name="row">The row index of a cell</param> /// <param name="column">The column index of a cell</param> public Cell(long row, long column) { this.row = row; this.column = column; dataChange = true; address = string.Empty; columnAddress = string.Empty; } /// <summary> /// Initializes a new instance of the XLS.Cell /// class with the specified address of excel worksheet /// </summary> /// <param name="address">The adress of a cell</param> public Cell(string address) { this.address = address; dataChange = false; row = GetRow(address); columnAddress = GetColumnAddress(address); column = GetColumn(columnAddress); } /// <summary> /// Gets or sets the row of this XLS.Cell /// </summary> public long Row { get { return row <= 0 ? 1 : row; } set { row = value; dataChange = true; } } /// <summary> /// Gets or sets the column of this XLS.Cell /// </summary> public long Column { get { return column <= 0 ? 1 : column; } set { column = value; dataChange = true; } } /// <summary> /// Gets or sets the address of this XLS.Cell /// </summary> public string Address { get { return dataChange ? ToAddress() : address; } set { address = value; row = GetRow(address); column = GetColumn(address); } } /// <summary> /// Gets the column address of this XLS.Cell /// </summary> public string ColumnAddress { get { return GetColumnAddress(Address); } private set { columnAddress = value; } } #region Private Methods private static long GetRow(string address) { return long.Parse(address.Substring(GetStartIndex(address))); } private static string GetColumnAddress(string address) { return address.Substring(0, GetStartIndex(address)).ToUpperInvariant(); } private static long GetColumn(string columnAddress) { char[] characters = columnAddress.ToCharArray(); int sum = 0; for (int i = 0; i < characters.Length; i++) { sum *= 26; sum += (characters[i] - 'A' + 1); } return (long)sum; } private static int GetStartIndex(string address) { return address.IndexOfAny("123456789".ToCharArray()); } private string ToAddress() { string indexToString = string.Empty; if (Column > 26) { indexToString = ((char)(65 + (int)((Column - 1) / 26) - 1)).ToString(); } indexToString += (char)(65 + ((Column - 1) % 26)); dataChange = false; return indexToString + Row; } #endregion } 

}

O24有一个列号,你想要一个名字:

= LEFT(RIGHT(ADDRESS(1,O24),LEN(ADDRESS(1,O24)) – 1),FIND( “$”,RIGHT((ADDRESS(1,O24)),LEN(ADDRESS(1,O24) )-1)) – 1)

O37有一个列名,你想要一个号码:

= COLUMN(INDIRECT(O37&1))

 public static string GetColumnName(int index) { const string letters = "ZABCDEFGHIJKLMNOPQRSTUVWXY"; int NextPos = (index / 26); int LastPos = (index % 26); if (LastPos == 0) NextPos--; if (index > 26) return GetColumnName(NextPos) + letters[LastPos]; else return letters[LastPos] + ""; }