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.
'Development Tip' 카테고리의 다른 글
Android Studio 렌더링 문제 : 다음 클래스를 찾을 수 없습니다. (0) | 2020.12.10 |
---|---|
App Store에 업로드 할 때 Xcode 오류 : "적합한 응용 프로그램 레코드를 찾을 수 없습니다." (0) | 2020.12.10 |
지정된 날짜에서 연도 가져 오기 PHP (0) | 2020.12.10 |
iOS 웹 앱 (특히 iPad 용)에 대한 여러 "apple-touch-startup-image"해상도? (0) | 2020.12.10 |
R을 사용하여 gz 파일 압축 해제 (0) | 2020.12.10 |