source

Excel 시트 열 이름을 숫자로 변환하는 방법은 무엇입니까?

manysource 2023. 7. 4. 22:00

Excel 시트 열 이름을 숫자로 변환하는 방법은 무엇입니까?

엑셀 시트 열 이름을 숫자로 변환하는 가장 좋은 방법이 무엇인지 궁금합니다.

.xlsx 문서를 처리하기 좋은 라이브러리인 Excel Package로 작업하고 있습니다.유감스럽게도 이 라이브러리에는 이 기능이 포함되어 있지 않습니다.

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

저는 몇 달 전에 이것을 처리해야 했습니다.열 이름에 대한 역 열 인덱스도 재미있고, 이것이 상황을 복잡하게 만든다는 것을 인식하지 못하는 제로 기반 인덱스로 해결하려고 하면 정말 엉망이 됩니다.일반적인 다항식 숫자 체계라면 매우 간단할 수 있습니다...

여기 오류 처리 및 기타 모든 것이 없는 확장 방법인 단순화된 버전의 솔루션이 있습니다.

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

저는 이것과 함께 한동안 일했고 이것이 A-Z를 넘어서거나 심지어 AA-Z를 넘는 열에 정말로 효과가 있다는 것을 발견했습니다.문자열의 각 문자를 분할하고 재귀적으로 호출하여 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));
    }

또한 역방향(예: Number 열을 전달하고 Name 열을 전달)을 얻고 싶다면, 여기에 사용할 수 있는 코드가 있습니다.

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

소스 코드:

namespace 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(RECT(주소(1,O24),LEN(주소(1,O24))-1),FIND("$"),RIGHT(((주소(1,O24)),LEN(주소(1,O24)-1)-1)-1)

O37에는 열 이름이 있으며 다음과 같은 번호가 필요합니다.

= 컬럼(간접(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] + "";
}

언급URL : https://stackoverflow.com/questions/848147/how-to-convert-excel-sheet-column-names-into-numbers