2009-03-20 67 views
49

Tôi cần một thuật toán để chuyển đổi một lá thư cột Excel để số thích hợp của nó.các thuật toán để chuyển đổi một Column Letter Excel vào Số của nó là gì?

Ngôn ngữ này sẽ được viết bằng C#, nhưng bất kỳ sẽ làm gì hoặc thậm chí mã giả.

Xin lưu ý Tôi sẽ đặt điều này trong C# và tôi không muốn sử dụng dll văn phòng.

Đối với 'A' là kết quả dự kiến ​​sẽ là 1

Đối với 'AH' = 34

Đối với 'XFD' = 16384

+5

Đối ngược lại (từ số vào cột chữ cái) xem: http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa – surfmuggle

Trả lời

90
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; 
} 
+4

Sử dụng Math.Pow thực sự không phải là ý tưởng hay nhất (vấn đề dấu chấm động, hiệu suất ...) Sử dụng 'sum * = 26; sum + = (ký tự [i] -' A '+ 1);' – ackb

+0

Tác phẩm tuyệt vời Tuyệt vời, cảm ơn bạn rất nhiều. –

+0

Tôi tò mò, mục đích của mảng ký tự là gì? Nó xuất hiện để làm việc bằng cách lập chỉ mục trực tiếp vào chuỗi với: sum + = (columnName [i] - 'A' + 1) – RyanW

3

Ông có thể có lẽ đối xử với nó như một số cơ sở 26, và sau đó thay thế các chữ cái cho một số cơ sở 26?

Vì vậy, có hiệu lực, chữ số bên phải của bạn sẽ luôn là số thô từ 1 đến 26 và phần còn lại của "số" (phần bên trái) là số 26 được thu thập? Vì vậy, A sẽ đại diện cho một lô 26, B sẽ là 2, vv

Như một ví dụ:

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

vv

+0

"Bạn có thể có lẽ coi nó như một số 26 cơ bản ". Điều này không nên hoạt động vì hệ thống số được đề xuất của bạn thiếu số không. Nhưng nhìn vào ví dụ của bạn cho tôi một ý tưởng rằng tôi sẽ đưa vào mã trong câu trả lời của tôi. –

+0

@BH - trong ngữ cảnh của câu hỏi, điều này là không cần thiết - không có cột số 0 trong Excel (câu hỏi là "Thuật toán chuyển đổi một Thư Cột Excel thành Số của nó là gì?"). Có nói rằng, vẫn còn có câu trả lời tốt hơn ở trên :) – Chris

4

Vòng qua các nhân vật từ trước đến đầu tiên. Nhân giá trị của mỗi chữ cái (A = 1, Z = 26) lần 26 ** N, cộng vào tổng số đang chạy. My chuỗi thao tác kỹ năng trong C# là không tồn tại, vì vậy đây là một số mã giả rất hỗn hợp:

sum=0; 
len=length(letters); 
for(i=0;i<len;i++) 
    sum += ((letters[len-i-1])-'A'+1) * pow(26,i); 
15
int result = colName.Select((c, i) => 
    ((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum(); 
7
int col = colName.ToCharArray().Select(c => c - 'A' + 1). 
      Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum(); 
+0

Hoàn hảo. Hãy cho tôi một chút thời gian để làm việc tại sao bạn đã đảo ngược (đó là vì BB cao hơn AZ). Và bạn tránh được bằng một lỗi chiều dài ký tự mà những người khác đã có bằng cách sử dụng chỉ mục. –

-2

Các bạn cần phải suy nghĩ bên ngoài quảng trường. Bạn không cần mã hóa phức tạp như vậy. Công thức sau cung cấp cùng một câu trả lời

= MID (ĐỊA CHỈ (ROW(), COLUMN()), 2, TÌM ("$", ADDRESS (ROW(), COLUMN()), 2) -2)

Công thức này sẽ cung cấp cho bạn các ký tự cột cho bất kỳ cột nào mà bạn đang ở. Dễ dàng thích nghi để thay đổi tham chiếu đến cột khác.

+2

Bạn cần phải tìm hiểu để hiểu các câu hỏi tốt hơn. Lấy làm tiếc. –

+4

"Các bạn cần phải suy nghĩ bên ngoài quảng trường.", Anh ấy đã yêu cầu mã psuedo hoặc ví dụ C#, không phải ví dụ về hàm inline trong Excel. Tôi nghĩ rằng vấn đề là bạn không suy nghĩ bên ngoài của Excel! –

3

Đây là một giải pháp tôi đã viết lên trong JavaScript nếu có ai quan tâm.

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

trong Excel VBA bạn có thể sử dụng phương pháp .Range để có được số lượng, như vậy:

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

Sau đó, sử dụng tài sản .column:

debug.print rng.column 

nếu bạn cần mã đầy đủ xem dưới đây :

0

Tôi đoán điều này về cơ bản hoạt động khá giống với một số câu trả lời khác, nhưng nó có thể làm rõ hơn một chút những gì đang xảy ra với alpha tương đương với một chữ số. Nó không hoàn toàn là một hệ thống cơ sở 26 vì không có 0 trình giữ chỗ. Đó là, cột thứ 26 sẽ là 'A0' hoặc thứ gì đó thay vì Z ở căn cứ 26.Và nó không phải là cơ sở 27 bởi vì 'alpha-gits' không đại diện cho sức mạnh của 27. Man, nó thực sự làm cho bạn đánh giá cao những gì một số học mess phải có được trước khi người Babylon phát minh ra số không!

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

Giống như một số khác, tôi đã đảo ngược mảng ký tự để không cần biết gì về số mũ.

1

Tôi không hoàn toàn hài lòng với bất kỳ câu trả lời, vì vậy đây là một phiên bản ngắn:

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

hoặc tốt hơn, để bỏ qua không A-Za-z ký tự:

int col = " !$Ab$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 97) > 25 ? a : a * 26 + c & 31); // 28 
Các vấn đề liên quan