Trochę się spóźniłem, aby odpowiedzieć na to pytanie, ale zaakceptowana odpowiedź nie zadziała, jeśli w wierszu, w którym jesteś zainteresowany, są puste komórki, ponieważ nie gwarantują, że są w XML, schemat pozwala na pominięcie pustych komórek.
Aby uzyskać indeks można użyć obiektu Cell
wihch ma właściwość CellReference
który daje odniesienie w formacie A1
, B1
itd. Można użyć tego odniesienia, aby wyodrębnić numer kolumny.
Jak zapewne wiecie, w programie Excel A = 1
, B = 2
etc do Z = 26
w którym momencie komórki są poprzedzone A
dać AA = 27
, AB = 28
itd. Należy pamiętać, że w przypadku AA
pierwszy A
ma wartość 26 razy drugi; tzn. jest "warty" 26, podczas gdy drugi A
jest "warty" 1, dając łącznie 27.
Aby obliczyć indeks kolumny, możesz odwrócić litery, a następnie przyjąć wartość pierwszej litery i dodać ją do suma całkowita. Następnie weź wartość drugiej litery i pomnóż ją przez 26, dodając sumę do pierwszej liczby. Za trzecią liczbę pomnożyć przez 26 dwukrotnie i dodać, czwarty pomnożyć przez 26 3 razy i tak dalej.
Tak na kolumnie ABC
byś zrobił:
C = 3
B = 2 * 26 = 52
A = 1 * 26 *26 = 676
3 + 52 + 676 = 731
W języku C# dodaje zadziała:
private static int? GetColumnIndex(string cellReference)
{
if (string.IsNullOrEmpty(cellReference))
{
return null;
}
//remove digits
string columnReference = Regex.Replace(cellReference.ToUpper(), @"[\d]", string.Empty);
int columnNumber = -1;
int mulitplier = 1;
//working from the end of the letters take the ASCII code less 64 (so A = 1, B =2...etc)
//then multiply that number by our multiplier (which starts at 1)
//multiply our multiplier by 26 as there are 26 letters
foreach (char c in columnReference.ToCharArray().Reverse())
{
columnNumber += mulitplier * ((int)c - 64);
mulitplier = mulitplier * 26;
}
//the result is zero based so return columnnumber + 1 for a 1 based answer
//this will match Excel's COLUMN function
return columnNumber + 1;
}
Zauważ, że CellReference
jest nie gwarancją w XML albo (chociaż Nigdy tego nie widziałem). W przypadku, gdy CellReference
ma wartość null, komórka jest umieszczana w najbardziej dostępnej z lewej komórki. Model RowIndex
nie jest również wymagany w specyfikacji, więc można go pominąć, w którym to przypadku komórka jest umieszczona w najwyższym dostępnym rzędzie. Więcej informacji można znaleźć w this question. Numer answer z @BCdotWEB to prawidłowe podejście w przypadkach, gdy CellReference
jest null
.
Dla przyszłych czytelników, polecam [widząc tę odpowiedź] (http://stackoverflow.com/a/667902/906773). –