c# interop - Was ist der Algorithmus, um einen Excel-Spaltenbuchstaben in seine Nummer zu konvertieren?




5 Answers

public static int ExcelColumnNameToNumber(string columnName)
{
    if (string.IsNullOrEmpty(columnName)) throw new ArgumentNullException("columnName");

    columnName = columnName.ToUpperInvariant();

    int sum = 0;

    for (int i = 0; i < columnName.Length; i++)
    {
        sum *= 26;
        sum += (columnName[i] - 'A' + 1);
    }

    return sum;
}
library erstellen

Ich brauche einen Algorithmus, um einen Excel-Spaltenbuchstaben in die richtige Zahl zu konvertieren.

Die Sprache, in der dies geschrieben wird, ist C #, aber jede würde tun oder sogar Pseudocode.

Bitte beachten Sie, dass ich dies in C # setze und die Office-DLL nicht verwenden möchte.

Für 'A' wird das erwartete Ergebnis 1 sein

Für 'AH' = 34

Für 'XFD' = 16384




int col = colName.ToCharArray().Select(c => c - 'A' + 1).
          Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();



Könntest du es vielleicht wie eine 26-stellige Nummer behandeln und dann Buchstaben für eine 26-stellige Nummer ersetzen?

In der Tat wird Ihre rechte ganzzahlige Ziffer immer eine rohe Zahl zwischen 1 und 26 sein, und der Rest der "Zahl" (der linke Teil) ist die Anzahl der 26er gesammelt? Also würde A eine Menge von 26 repräsentieren, B wäre 2 usw.

Als Beispiel:

B = 2 = Column 2
AB = 26 * 1(A) + 2 = Column 28
BB = 26 * 2(B) + 2 = Column 54
DA = 26 * 4(D) + 1 = Column 105

etc




Ich bin mit keiner der Antworten recht zufrieden, daher hier eine kurze Version:

int col = "Ab".Aggregate(0, (a, c) => a * 26 + c & 31);  // 28

oder besser, um nicht A-Za-z Zeichen zu ignorieren:

int col = " !$Ab$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 97) > 25 ? a : a * 26 + c & 31); // 28



Ich denke, das funktioniert im Wesentlichen genauso wie einige der anderen Antworten, aber es kann ein wenig deutlicher machen, was mit dem Alpha-Äquivalent einer numerischen Ziffer passiert. Es ist kein Basis-26-System, weil es keinen 0-Platzhalter gibt. Das heißt, die 26. Spalte wäre "A0" oder etwas anderes als Z in Basis 26. Und es ist nicht Base 27, weil die "Alpha-Gits" keine Potenzen von 27 darstellen. Mann, es macht dich wirklich zu schätzen, was für ein Durcheinander Arithmetik muss gewesen sein, bevor die Babylonier die Null erfunden haben!

  UInt32 sum = 0, gitVal = 1;
  foreach (char alphagit in ColumnName.ToUpperInvariant().ToCharArray().Reverse())
  {
    sum += gitVal * (UInt32)('A' - alphagit + 1);
    gitVal *= 26;
  }

Wie bei einigen anderen habe ich das Zeichenarray umgekehrt, so dass ich nichts über Exponenten wissen muss.




Related

c# excel math

Tags

c#   excel   math