2009-03-27 4 views
1

Работа с некоторыми электронными таблицами материала, внутри колонны называют простым десятичного числа (0 индексируется), но для выхода, мне это нужно, чтобы быть в стандартном читаемом формате:Преобразование десятичной в алфавитном идентификаторе столбца?

A, B, C, .. Z, AA, AB, AC, .. AZ, BA .. 

Я первый подумал «просто!» Я просто переключусь на базу 26 и использую [AZ] вместо [0-9A-P] », за исключением того, что использование этого метода делает A => 0. B => 1. Поэтому последовательность действительно идет как это:

A, B, .. Y, Z, BA, BB 

Как вы преобразовываете десятичные знаки в имя столбца в стиле excel?

ответ

0

Это, вероятно, не самый эффективный способ, но он довольно краток, и он работает. Вероятно, стоит поставить диапазон проверки, что он не будет выше ZZ в производственном коде, поскольку я подозреваю, что тогда произойдут плохие вещи. И, конечно, вы можете развернуть условный оператор в if/else, если вам это не нравятся.

static string ColumnPrefix(int column) 
{ 
    Debug.Assert(column >= 0, "Column would be below 'A'."); 
    Debug.Assert(column <= 26 * 27, "Column would be above 'ZZ'."); 

    Func<int, string> itoa = i => new string((char)('A' + i), 1); 
    return column < 26 ? 
       itoa(column) : 
       itoa((column - 26)/26) + itoa(column % 26); 
} 
+0

"(столбец - 26)/26" будет лучше выражена "столбец/26 - 1"? – TechTravelThink

-1

Вот функция VB. Эксплуатируя по модулю и логарифм, это тривиально и не рекурсии необходимо:

Function ColumnLetter(ByVal colNum As Long) As String 
    Dim i As Long, x As Long 
    For i = Int(Log(CDbl(25 * (CDbl(colNum) + 1)))/Log(26)) - 1 To 0 Step -1 
     x = (26^(i + 1) - 1)/25 - 1 
     If colNum > x Then 
      ColumnLetter = ColumnLetter & Chr(((colNum - x - 1) \ 26^i) Mod 26 + 65) 
     End If 
    Next i 
End Function 

Soure

0

В VB кода .NET и с помощью рекурсии для выразительности

Function Decimal2ExcelAZ(ByVal number As Integer) As String 
    If number < 0 Then 
     Throw New Exception("Number cannot be negative") 
    ElseIf number < 26 Then 
     Rem 65 is the ASCII of "A" 
     Return New String(Chr(65 + number) + "")   
    Else 
     Return Decimal2ExcelAZ(number \ 26 - 1) + Decimal2ExcelAZ(number Mod 26) 
    End If 
    End Function 
0

Вот решение в PHP, взяты в значительной степени непосредственно от this answer от Graham:

function rowCol2Cell($row, $col) { 
    $dividend = $col + 1; 
    $columnName = ''; 

    while ($dividend > 0) { 
     $modulo = ($dividend - 1) % 26; 
     $columnName = chr(65 + $modulo) . $columnName; 
     $dividend = (int)(($dividend - $modulo)/26); 
    } 

    return $columnName . ($row + 1); 
} 

// rowCol2Cell(0, 0) = "A1" 
// rowCol2Cell(0, 1) = "B1" 
// rowCol2Cell(0,26) = "AA1" 

Edit:

Если вы используете PHP модуль PEAR Электронная таблица Excel Writer, то он имеет эту функцию встроенного в:

Spreadsheet_Excel_Writer::rowcolToCell 

Я, вероятно, Shoulda просто RTFM, эй ...

0

не быть бы полным без версии Java ...

protected static String columnLetter(int columnNumber) { 
if(columnNumber < 0) return "Err"; 
if(columnNumber < 26) 
    return Character.toString((char) (columnNumber+ 65)); 
return columnLetter((columnNumber/26) - 1) + 
    columnLetter (columnNumber % 26); 
} 

(на основе рекурсивного примере VB .NET)