Development Tip

Excel 열 문자를 숫자로 변환하는 알고리즘은 무엇입니까?

yourdevel 2020. 12. 10. 21:24
반응형

Excel 열 문자를 숫자로 변환하는 알고리즘은 무엇입니까?


Excel 열 문자를 적절한 숫자로 변환하는 알고리즘이 필요합니다.

이것이 작성 될 언어는 C #이지만 어떤 것이 든 가능하거나 심지어 의사 코드입니다.

저는 이것을 C #에 넣을 것이고 office dll을 사용하고 싶지 않습니다.

'A'의 경우 예상 결과는 1입니다.

'AH'= 34 인 경우

'XFD'= 16384의 경우


public static int ExcelColumnNameToNumber(string columnName)
{
    if (string.IsNullOrEmpty(columnName)) throw new ArgumentNullException("columnName");

    columnName = columnName.ToUpperInvariant();

    int sum = 0;

    for (int i = 0; i < columnName.Length; i++)
    {
        sum *= 26;
        sum += (columnName[i] - 'A' + 1);
    }

    return sum;
}

int result = colName.Select((c, i) =>
    ((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();

int col = colName.ToCharArray().Select(c => c - 'A' + 1).
          Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();

마지막에서 처음으로 문자를 반복합니다. 각 문자의 값 (A = 1, Z = 26)에 26 ** N을 곱하고 누계에 더합니다. C #의 내 문자열 조작 기술은 존재하지 않으므로 다음은 매우 혼합 된 의사 코드입니다.

sum=0;
len=length(letters);
for(i=0;i<len;i++)
  sum += ((letters[len-i-1])-'A'+1) * pow(26,i);

26 진법 숫자로 취급 한 다음 26 진법 숫자 대신 문자로 대체 할 수 있습니까?

따라서 실제로 가장 오른쪽 숫자는 항상 1에서 26 사이의 원시 숫자이고 나머지 "숫자"(왼쪽 부분)는 수집 된 26 개의 숫자입니까? 따라서 A는 26 개 중 1 개, B는 2 개 등을 나타냅니다.

예로서:

B = 2 = 열 2
AB = 26 * 1 (A) + 2 = 열 28
BB = 26 * 2 (B) + 2 = 열 54
DA = 26 * 4 (D) + 1 = 105 열

기타


관심이 있다면 JavaScript로 작성한 솔루션이 있습니다.

var letters = "abc".toUpperCase();
var sum = 0;
for(var i = 0; i < letters.length;i++)
{
    sum *= 26;
    sum += (letters.charCodeAt(i) - ("A".charCodeAt(0)-1));
}
alert(sum);

나는 어떤 답변에도 만족하지 않으므로 여기에 짧은 버전이 있습니다.

int col = "Ab".Aggregate(0, (a, c) => a * 26 + c & 31);  // 28

또는 더 나은, 비 A-Za-z문자 무시 :

int col = " !$Ab$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 97) > 25 ? a : a * 26 + c & 31); // 28

Excel VBA에서는 .Range메서드를 사용하여 다음과 같이 번호를 가져올 수 있습니다 .

Dim rng as Range
Dim vSearchCol as variant 'your input column
Set rng.Thisworkbook.worksheets("mySheet").Range(vSearchCol & "1:" & vSearchCol & "1")

그런 다음 .column속성을 사용하십시오 .

 debug.print rng.column

전체 코드가 필요한 경우 아래를 참조하십시오.

Function ColumnbyName(vInput As Variant, Optional bByName As Boolean = True) As Variant
    Dim Rng As Range
    If bByName Then
       If Not VBA.IsNumeric(vInput) Then
            Set Rng = ThisWorkbook.Worksheets("mytab").Range(vInput & "1:" & vInput & "1")
            ColumnbyName = Rng.Column
       Else
            MsgBox "Please enter valid non Numeric column or change paramter bByName to False!"
       End If

    Else
        If VBA.IsNumeric(vInput) Then
            ColumnbyName = VBA.Chr(64 + CInt(vInput))
        Else
            MsgBox "Please enter valid Numeric column or change paramter bByName to True!"
        End If

    End If
End Function

I guess this essentially works out pretty much the same as some of the other answers, but it may make a little more clear what's going on with the alpha equivalent of a numeric digit. It's not quite a base 26 system because there is no 0 placeholder. That is, the 26th column would be 'A0' or something instead of Z in base 26. And it's not base 27 because the 'alpha-gits' don't represent powers of 27. Man, it really makes you appreciate what a mess arithmetic must have been before the Babylonians invented the zero!

  UInt32 sum = 0, gitVal = 1;
  foreach (char alphagit in ColumnName.ToUpperInvariant().ToCharArray().Reverse())
  {
    sum += gitVal * (UInt32)(alphagit - 'A' + 1)
    gitVal *= 26;
  }

Like some others, I reversed the character array so I don't need to know anything about exponents.

참고URL : https://stackoverflow.com/questions/667802/what-is-the-algorithm-to-convert-an-excel-column-letter-into-its-number

반응형