在C#中生成Excel列字母的最快功能

35 c# excel performance

什么是最快的c#函数,它接受并返回包含一个或多个字母的字符串,以便在Excel函数中使用?例如,1返回"A",26返回"Z",27返回"AA"等.

这被称为成千上万次,并且需要25%的时间来生成具有许多公式的大型电子表格.

public string Letter(int intCol) {

    int intFirstLetter = ((intCol) / 676) + 64;
    int intSecondLetter = ((intCol % 676) / 26) + 64;
    int intThirdLetter = (intCol % 26) + 65;

    char FirstLetter = (intFirstLetter > 64) ? (char)intFirstLetter : ' ';
    char SecondLetter = (intSecondLetter > 64) ? (char)intSecondLetter : ' ';
    char ThirdLetter = (char)intThirdLetter;

    return string.Concat(FirstLetter, SecondLetter, ThirdLetter).Trim();
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*der 49

我目前使用Excel 2007

public static string ExcelColumnFromNumber(int column)
        {
            string columnString = "";
            decimal columnNumber = column;
            while (columnNumber > 0)
            {
                decimal currentLetterNumber = (columnNumber - 1) % 26;
                char currentLetter = (char)(currentLetterNumber + 65);
                columnString = currentLetter + columnString;
                columnNumber = (columnNumber - (currentLetterNumber + 1)) / 26;
            }
            return columnString;
        }
Run Code Online (Sandbox Code Playgroud)

public static int NumberFromExcelColumn(string column)
        {
            int retVal = 0;
            string col = column.ToUpper();
            for (int iChar = col.Length - 1; iChar >= 0; iChar--)
            {
                char colPiece = col[iChar];
                int colNum = colPiece - 64;
                retVal = retVal + colNum * (int)Math.Pow(26, col.Length - (iChar + 1));
            }
            return retVal;
        }
Run Code Online (Sandbox Code Playgroud)

正如其他帖子中所提到的,结果可以缓存.

  • +1:可能不是最快的,但对我需要做的事情很有用:) (2认同)

wom*_*omp 19

我可以告诉你,最快的功能不是最漂亮的功能.这里是:

private string[] map = new string[]
    { 
        "A", "B", "C", "D", "E" .............
    };

public string getColumn(int number)
{
    return map[number];
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下,这个映射应该是静态的,这样它就不会为每个实例重复(并可能重新生成). (6认同)
  • 嘿,他要求最快!您添加的任何代码会自动预先填充它会变慢;) (4认同)
  • 引起对数组方法的关注是一个很好的观点,尽管手动定义它并不是一个好主意.预生成是要走的路. (3认同)

bar*_*owc 14

根本不要转换它.Excel可以在R1C1表示法中使用,也可以在A1表示法中使用.

所以(道歉使用VBA而不是C#):

Application.Worksheets("Sheet1").Range("B1").Font.Bold = True
Run Code Online (Sandbox Code Playgroud)

可以很容易地写成:

Application.Worksheets("Sheet1").Cells(1, 2).Font.Bold = True
Run Code Online (Sandbox Code Playgroud)

Range属性采用A1表示法,而Cells属性采用(行号,列号).

要选择多个单元格:( Range(Cells(1, 1), Cells(4, 6))如果不使用活动工作表,NB将需要某种对象限定符)而不是Range("A1:F4")

Columns物业可以采用字母(例如F)或数字(例如6)


小智 5

这是我的版本:这没有任何限制,如2个字母或3个字母.只需传入所需的数字(从0开始)将返回Excel列标题,如字母序列,用于传入的数字:

private string GenerateSequence(int num)
{
    string str = "";
    char achar;
    int mod;
    while (true)
    {
        mod = (num % 26) + 65;
        num = (int)(num / 26);
        achar = (char)mod;
        str = achar + str;
        if (num > 0) num--;
        else if (num == 0) break;
    }
    return str;
}
Run Code Online (Sandbox Code Playgroud)

我没有测试这个性能,如果有人能做到这一点对其他人来说会很棒.(抱歉懒惰):)

干杯!


JDu*_*ley 4

您可以将所有值预先生成到字符串数组中。这将占用很少的内存,并且可以在第一次调用时进行计算。