2012-04-29 36 views
5

thể trùng lặp:
How to convert a column number (eg. 127) into an excel column (eg. AA)Chuyển đổi một số thành một lá thư trong C# để sử dụng trong Microsoft Excel

Ok vì vậy tôi đang viết một phương pháp mà chấp nhận một mảng 2ngày như một tham số. Tôi muốn đặt mảng 2d này vào một bảng tính Excel nhưng tôi cần phải làm việc ra vị trí ô cuối cùng. Tôi có thể lấy chiều cao một cách dễ dàng đủ như vậy:

var height = data.GetLength(1); //`data` is the name of my 2d array 

này mang lại cho tôi trục Y của tôi, nhưng nó không phải là dễ dàng như vậy để có được trục X tôi. Rõ ràng tôi có thể lấy số như vậy:

var width = data.GetLength(0); 

Điều này mang lại cho tôi một số mà tôi muốn chuyển đổi thành chữ cái. Vì vậy, ví dụ, 0 là A, 1 là B và cứ như vậy cho đến khi chúng ta đạt đến 26 và quay trở lại A lần nữa. Tôi chắc chắn rằng có một cách đơn giản để làm điều này nhưng tôi có một khối tổng thể về tinh thần.

Bạn sẽ làm gì?

Cảm ơn

+0

Tôi không đủ hiểu câu hỏi của bạn. Nếu bạn muốn trục x bạn có thể làm 'dữ liệu [0] .GetLength (1)'. Hoặc nếu mảng 2D của bạn có kích thước khác nhau, bạn có thể làm 'dữ liệu [i] .GetLength (1)' – noMAD

+0

Tôi đang cố gắng lấy tên của ô, ví dụ nếu tôi có mảng 4x4 và tôi bắt đầu từ A1 tên ô cuối cùng sẽ là "D4". Tôi có thể lấy đủ 4 chỉ với 'data.GetLength (1)' nhưng 'data.GetLength (0)' cho tôi một số, từ đó tôi muốn tìm ra chữ cái tương ứng ("D"). – JMK

+3

sử dụng kiểu tham chiếu R1C1 để bạn không phải tính toán chữ cái, hoặc lấy ô có topLeftCell.Offset (arrayHeight, arrayWidth) – phoog

Trả lời

23

Dưới đây là một phiên bản đó cũng xử lý cột hai chữ cái (sau cột Z):

static string GetColumnName(int index) 
{ 
    const string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    var value = ""; 

    if (index >= letters.Length) 
     value += letters[index/letters.Length - 1]; 

    value += letters[index % letters.Length]; 

    return value; 
} 
+0

Điều đó hoạt động hoàn hảo, cảm ơn bạn! – JMK

+0

Vui lòng giải thích lý do đằng sau điều này bằng lời nói. – stackptr

+1

@EdwardKarak Nếu bạn nhìn vào phạm vi AZ dưới dạng tập hợp các chữ số, số nguyên trong cơ sở 10 * n * có thể được chuyển đổi thành một số được viết bằng ký hiệu AZ (tối đa hai chữ số), trong đó: chữ số đầu tiên là kết quả của phép chia * n * với số chữ số (26) và chữ số thứ hai sẽ là phần còn lại của bộ phận đó. – GolfWolf

1

Chỉ cần bỏ nó vào một char và làm "ToString()".

using System; 
using System.Collections.Generic; 

public class MyClass 
{ 
    public static void RunSnippet() 
    { 
     int myNumber = 65; 
     string myLetter = ((char) myNumber).ToString(); 
     WL(myLetter); 
    } 

    #region Helper methods 

    public static void Main() 
    { 
     try 
     { 
      RunSnippet(); 
     } 
     catch (Exception e) 
     { 
      string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString()); 
      Console.WriteLine(error); 
     } 
     finally 
     { 
      Console.Write("Press any key to continue..."); 
      Console.ReadKey(); 
     } 
    } 

    private static void WL(object text, params object[] args) 
    { 
     Console.WriteLine(text.ToString(), args); 
    } 

    private static void RL() 
    { 
     Console.ReadLine(); 
    } 

    private static void Break() 
    { 
     System.Diagnostics.Debugger.Break(); 
    } 

    #endregion 
} 
+0

Điều này thậm chí sẽ không biên dịch, hãy để một mình chuyển đổi số cột đúng cách. –

+0

GC Sid, đây là phiên bản có thể kết hợp. – bnieland

+0

Nhưng nó vẫn không trả lời đầy đủ câu hỏi của OP về cách chuyển đổi số cột thành tên. Khi nó đến 27 mã của bạn sẽ trả về '['. Câu trả lời đầu tiên [ở đây] (http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa) sẽ làm điều đó tốt. –

Các vấn đề liên quan