2009-05-11 26 views
10

मैं सोच रहा था कि एक्सेल शीट कॉलम नामों को संख्याओं में परिवर्तित करने का सबसे अच्छा तरीका क्या है।एक्सेल शीट कॉलम नामों को संख्याओं में कैसे परिवर्तित करें?

मैं 0x, .xlsx दस्तावेज़ों को संभालने के लिए एक अच्छी लाइब्रेरी के साथ काम कर रहा हूं। दुर्भाग्य से इस पुस्तकालय में यह कार्यक्षमता शामिल नहीं है।

ओबीएस: पहला कॉलम, ए, इस लाइब्रेरी में नंबर 1 से मेल खाता है।

उत्तर

50

यह फ़ंक्शन मनमाने ढंग से लंबाई कॉलम नाम के लिए काम करना चाहिए।

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; 
} 
+1

अच्छा! ! –

+0

वास्तव में अच्छा, आदमी। मैं यह कर रहा था, लेकिन विधि इस सरल समाधान से बड़ा तरीका था। –

+0

धन्यवाद। और हाँ, मुझे लगता है कि यह बहुत आसान लगता है, हालांकि किसी भी अनुकूलन का सुझाव देने के लिए स्वतंत्र महसूस करें ... – Noldorin

14

मुझे कुछ महीने पहले इसका सामना करना पड़ा था। उलटा कॉलम इंडेक्स कॉलम नाम - मजेदार भी है, और वास्तव में गन्दा हो जाता है यदि आप इसे शून्य आधारित इंडेक्स के साथ हल करने का प्रयास करते हैं, यह स्वीकार नहीं करते कि यह चीजों को जटिल करता है। यह इतना आसान हो सकता है कि यह सामान्य पॉलीएडिक अंक प्रणाली होगी ...

यहां त्रुटि समाधान के बिना एक विस्तार विधि के रूप में मेरे समाधान का सरलीकृत संस्करण है और यह सब कुछ है।

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

मैन, वह तंग है। +1 – wcm

+0

यह शुद्ध कला है :) +1 –

+0

उत्कृष्ट समाधान .... –

2

मैं अब थोड़ी देर के लिए इस के साथ काम किया गया है और इस कॉलम कि AZ से परे जाना, या यहाँ तक ए.ए. जेडजेड परे के लिए वास्तव में अच्छा काम करने के लिए मिल गया ... यह पूरा किया है में अलग हर किरदार को तोड़कर स्ट्रिंग और पुनरावर्ती रूप से एएससीआईआईआई चरित्र (कम 64) के डीईसी मूल्य को प्राप्त करने के लिए बुला रहा है, फिर इसे 26^एन द्वारा गुणा कर रहा है। लंबे समय तक की वापसी मान एक संभावित सीमा को पार करने के लिए इस्तेमाल किया गया था जब n> 4.

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(); 
    } 
0

मेरी कोड कोशिश

नाम स्थान 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 
} 

}

0

O24 एक स्तंभ संख्या है और आप एक नाम हैं:

= वाम (अधिकार (ADDRESS (1, O24), LEN (ADDRESS (1, O24)) - 1), FIND (" $ ", सही ((ADDRESS (1, O24)), LEN (ADDRESS (1, O24)) - 1)) - 1)

O37 एक स्तंभ नाम है और आप एक संख्या हैं:

= स्तंभ (अप्रत्यक्ष (O37 & 1))

0
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] + ""; 
} 
संबंधित मुद्दे