如何简化这个花哨的 Column-number-to-column-Alpha 表示函数?

How can this fancy-pants Column-number-to-column-Alpha representation function be simplified?

我有这个遗留代码:

private Worksheet _xlSheet;
. . .
_xlSheet.PageSetup.PrintArea = "A1:" +
    GetExcelTextColumnName(_grandTotalsColumn) + finalRow;
. . .
protected string GetExcelTextColumnName(int columnNum)
{
    StringBuilder sb = new StringBuilder();
    if (columnNum > 26)
    {
        int firstLetter = ((columnNum - 1) / 26) + 64;
        int secondLetter = ((columnNum - 1) % 26) + 65;
        sb.Append((char)firstLetter);
        sb.Append((char)secondLetter);
    }
    else
    {
        sb.Append((char)(64 + (columnNum - 1)));
    }
    return sb.ToString();
}

我把代码简化到这个程度:

_xlSheet.PageSetup.PrintArea = "A1:" + GetExcelTextColumnName(_xlSheet.UsedRange.Columns.Count) + _xlSheet.UsedRange.Rows.Count;

...但想知道是否有一种方法可以简化 "Column-number-to-column-Alpha" 花哨的代码。是否存在,或者现有的 GetExcelTextColumnName() 实际上是优雅且尽可能简洁和可维护的代码?

我会使用迭代算法,它将支持您在 Excel.

的最新版本中找到的超出 ZZ 的列
   private const string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public string GetColumnName(int columnIndex)
    {
        if (columnIndex < 0) throw new ArgumentOutOfRangeException("columnIndex", columnIndex, "Column index index may not be negative.");
        string result = "";
        for (; ; )
        {
            result = Alphabet[(columnIndex) % 26] + result;
            if (columnIndex < 26) break;
            columnIndex = columnIndex / 26 - 1;
        }
        return result;
    }

我还认为使用 StringBuilder 有点矫枉过正,因为您知道您可能只有一两个连接。

您也可以考虑使用 Range 对象来避免进行计算 - 可能稍微慢一些,但可以说更具可读性。类似于:

_xlSheet.PageSetup.PrintArea = 
    _xlSheet.Range("A1")
    .Resize(finalRow, _grandTotalsColumn).Address;