2010-03-26 62 views

回答

2

怎么样使用Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing),然后解析结果字符串或使用正则表达式来获取列标题?

我只是用:

string location = Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing); 
string tokens = x.Split("$".ToCharArray()); 
MessageBox.Show(String.Format("Column {0}", result[0])); 
+2

此代码是错误的。这里是一个更正的版本:\t \t var location = sheet.Range [“A1”]。Offset [0,columnNumber - 1] .Address [true,true,XlReferenceStyle.xlA1,Missing,Missing]; \t \t \t var tokens = location.Split('$'); \t \t \t return tokens [1]; – 2012-01-21 17:35:42

+0

@PhredMenyhert你的代码将只返回'B' – sam 2018-02-19 19:42:43

4
public static string GetColumnName(int columnNumber) 
{ 
    const string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    string columnName = ""; 

    while (columnNumber > 0) 
    { 
     columnName = letters[(columnNumber - 1) % 26] + columnName; 
     columnNumber = (columnNumber - 1)/26; 
    } 

    return columnName; 
} 
+1

嗯..如果有超过26列? AA,AB,AC等 – Ahmad 2010-03-30 07:12:46

+0

道歉..我意识到这个工程.. http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel- column-eg-aa – Ahmad 2010-03-30 08:24:46

0

以下是其中给你传递一个整数值对应的字母表的完整方法。

private String Number2String(int number, bool isCaps) 
    { 
     int number1 = number/27; 
     int number2 = number - (number1 * 26); 
     if (number2 > 26) 
     { 
      number1 = number1 + 1; 
      number2 = number - (number1 * 26); 
     } 
     Char a = (Char)((isCaps ? 65 : 97) + (number1 - 1)); 
     Char b = (Char)((isCaps ? 65 : 97) + (number2 - 1)); 
     Char c = (Char)((isCaps ? 65 : 97) + (number - 1)); 
     string d = String.Concat(a, b); 
     if (number <= 26) 
      return c.ToString(); 
     else 
      return d; 
    } 
1
public static long GetColumnNumber(string columnName) 
{ 
    int letterPos = 0; 
    long columnNumber = 0; 
    for (int placeHolder = columnName.Length - 1; placeHolder >= 0; placeHolder--) 
    { 
     int currentSum = 1; 
     for (int multiplier = 0; multiplier < placeHolder; multiplier++) 
      currentSum *= 26; 
     int letterValue = (int) columnName[letterPos]; 
     currentSum *= letterValue - 64; 
     columnNumber += currentSum; 
     if (letterPos != columnName.Length) 
      letterPos++; 
     //Console.WriteLine(((int)columnName[i]-64) + " = " + columnName[i]); 
    } 
     return columnNumber; 
} 
+0

只有当columnName是大写字符串,出于某种原因b不是B时,此方法才能正常工作。因此需要column.Name.ToUpper()。 – Jim 2015-08-18 08:52:13

0

我使用这两个:

ColumnLetter = Replace(Replace(R.AddressLocal(ReferenceStyle:=1), "$", vbNullString), R.Row, vbNullString) 是:

public string GetExcelColumn(int index) 
{ 
    int quotient = index/26; 

    if (quotient > 0) 
     return GetExcelColumn(quotient - 1) + (char)((int)'A' + (index % 26)); 
    else 
     return "" + (char)((int)'A' + index); 
} 

static IEnumerable<string> GetExcelColumns() 
{ 
    var alphabet = new string[]{""}.Union(from c in Enumerable.Range((int)'A', 26) select Convert.ToString((char)c)); 

    return from c1 in alphabet 
      from c2 in alphabet 
      from c3 in alphabet.Skip(1)     // c3 is never empty 
      where c1 == string.Empty || c2 != string.Empty // only allow c2 to be empty if c1 is also empty 
      select c1 + c2 + c3; 
} 
0

这通过使用双取代,其中R是单细胞Excel范围在VBA效果很好基于在Worksheet上使用的等效想法。在单元格公式中使用它,它甚至更短:

=SUBSTITUTE(ADDRESS(1,COLUMN(M1),4),1,"") 

这将返回字母M并工作到列XFD。单元参考M1可以是任何地方的任何范围。左上方的列将返回范围或多个单元格。

它获取列中第一个单元格的地址,然后通过替换NullString去除尾部1。 (ADDRESS中的4确保地址作为相对地址返回,即一个没有和$符号。)

感谢barry houdini谁让我为此寻求一个好的答案。