2015-11-26 18 views
-1

我有這樣的遺留代碼:如何簡化這個花式列數列到Alpha的表示函數?

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; 

...但不知道是否有簡化「列數-TO-方式列-Alpha「花式褲子代碼。是否存在,或者是現有的GetExcelTextColumnName()實際上是否優雅,簡潔並且可維護的代碼?

+0

這是一個遞歸算法的完美情況。 –

回答

2

我會使用迭代算法,它將支持您在最近版本的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; 
+0

謝謝;我做的唯一改變是將「const」改爲「static readonly」 –