在C#中将数字转换为字母以在Microsoft Excel中使用

18

可能是重复问题:
如何将列号(例如127)转换为Excel列(例如AA)?

好的,我正在编写一个接受二维数组作为参数的方法。我想把这个二维数组放到一个Excel工作表上,但是我需要计算出最终单元格的位置。我可以轻松地得到高度,比如:

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

这个方法可以给我Y轴,但是获取X轴不那么容易。显然,我可以像下面这样获取数值:

var width = data.GetLength(0);

这给了我一个数字,我想将它转换成字母。例如,0是A,1是B等等,直到我们到达26又回到A。我相信有一种简单的方法可以做到这一点,但我完全不知道该怎么做。

你会怎么做呢?

谢谢!


我不完全理解你的问题。如果你想要x轴,你可以使用data[0].GetLength(1)。或者,如果你的二维数组大小不同,你可以使用data[i].GetLength(1) - noMAD
我正在尝试获取单元格的名称。例如,如果我有一个4x4的数组,并且我从A1开始,最终单元格名称将是“D4”。我可以轻松地使用data.GetLength(1)得到数字4,但是data.GetLength(0)给我一个数字,我想找出相应的字母(“D”)。 - JMK
3
使用R1C1参照样式,这样你就不必计算字母,或者使用topLeftCell.Offset(arrayHeight, arrayWidth)获取单元格。 - phoog
@Mathias,那个问题的选定答案比这里任何一个答案都更完整。 - Sid Holland
@phoog 抱歉,我没看到这个问题,谢谢提醒! - JMK
2个回答

66

这里有一个版本,还可以处理两个字母的列(在列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;
}

请用语言解释其中的原因。 - lost_in_the_source
2
如果您将A-Z范围视为一组数字,则十进制整数n可以转换为以A-Z表示法编写的数字(最多两位数),其中:第一位数字是将n除以数字数量(26)的结果,第二位数字将是该除法的余数。 - Cristian Lupascu
3
它可以工作,但有一个错误。当您发送大于701的内容时,它会抛出IndexOutOfRangeException错误。 - bafsar
同时,对于26和27两个索引,它都返回'AA' - 假设第一个字母的索引是从零开始的,而第二个字母的索引是从一开始的。 - MaSiMan
@bafsar,是的,这只处理两个字母的列名。 - Cristian Lupascu
@MaSiMan 对于 26 和 27 它的运行是正确的。分别返回 AAAB - Cristian Lupascu

1
只需将其转换为char并执行“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
}

这甚至无法编译,更别说正确地转换列号了。 - Sid Holland
GC Sid,这是一个可编译的版本。 - bnieland
2
但它仍然没有完全回答OP的问题,即如何将列号转换为名称。一旦它到达27,您的代码将返回[这里的第一个答案可以很好地完成它。 - Sid Holland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接