Erweiterungs - Methode Integer zu Excel Spaltenname

  • C#

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Erweiterungs - Methode Integer zu Excel Spaltenname

    Ich versuche mich gerade an einer Erweiterungs - Methode mit der ich aus einem belibigen Integer den daraus resultierende Excel - Spalten - Index ermitteln kann.
    Das ganze funktioniert im erstem Durchlauf auch wie erwartet danach schleichen sich allerdings Dubletten ein. Eventuell kann mir ja jemand auf die Sprünge helfen.

    Mein Bisheriger Ansatz:

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. for (int i = 0; i < 90; i++)
    4. Console.WriteLine("{0} => {1}", i, ToXlsColumn(i));
    5. Console.ReadKey();
    6. }
    7. private static string ToXlsColumn(int col, int row = 1)
    8. {
    9. if (col < 26)
    10. return ((char)(col + 65)) + row.ToString();
    11. int interation = (col / 26);
    12. char c1 = (char)(interation + 64);
    13. char c2 = (char)((col / interation) - 26 + 65);
    14. return $"{c1}{c2}{row} --{interation}";
    15. }

    Als Ergebniss würde ich nun folgendes erwarten:

    Quellcode

    1. 50 => AY1 --1
    2. 51 => AZ1 --1
    3. 52 => BA1 --2
    4. 53 => BB1 --2
    5. 54 => BC1 --2
    6. 55 => BD1 --2
    7. 56 => BE1 --2
    8. 57 => BF1 --2


    Ich erhalte aber leider folgendes:

    Quellcode

    1. 50 => AY1 --1
    2. 51 => AZ1 --1
    3. 52 => BA1 --2 // Doppelt
    4. 53 => BA1 --2 // Doppelt
    5. 54 => BB1 --2 // Doppelt
    6. 55 => BB1 --2 // Doppelt
    7. 56 => BC1 --2 // Doppelt
    8. 57 => BC1 --2 // Doppelt
    Frag mich nicht wo ich das herhab, ich benutze es schon etliche Jahre und weiß die Quelle nicht mehr. Auf meinem Mist ist es jedenfalls nicht gewachsen

    C#-Quellcode

    1. internal static string GetExcelColumnName(Int32 columnNumber)
    2. {
    3. Int32 dividend = columnNumber;
    4. string columnName = GlobalVar.EMPTY;
    5. Int32 modulo;
    6. while (dividend > 0)
    7. {
    8. modulo = (dividend - 1) % 26;
    9. columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
    10. dividend = (Int32)((dividend - modulo) / 26);
    11. }
    12. return columnName;
    13. }


    Nachtrag: Funktion korrigiert, war die falsche eben...
    interessante programmier-Aufgabe. Könnte man im SourceCode-Austausch einstellen: [Sammelthread] Knobel-Aufgaben, knifflige Algorithmen, elegante Lösungen
    Lösungs-Hinweis: Es handelt sich bei den Bezeichnern von Excel-Spalten um ein Zahlensystem, und von den Zahlensystemen um ein StellenwertSystem
    Ziffernvorrat dieses StellenwertSystems ist: ABCDEFGHIJKLMNOPQRSTUVWXYZ.
    Mich wundert, dass du für
    50 => AY1 erwartest.
    Ich würde 50 => AM erwarten (nullbasiert, als A entspricht 0). Ziffern tauchen nach meinem Verständnis in Excel-SpaltenNamen nicht auf.

    Also habich vermutlich die Frage falsch verstanden.
    (die Dksksm-Lösung scheint jedenfalls nach meim Verständnis zu sein. Tut was sie soll, könnte man noch bisserl verbessern (Stichwort Math.DivRem(), StringBuilder))

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich versteh deine Problembeschreibung nicht.
    Bzw ich hab keine Ahnung, was man mit einer Methode anfangen soll, bei der man
    50, 1.Zeile eingeben kann, und sie gibt "AW1+1" zurück,
    und bei 50, 2.Zeile gibt sie "AW2+1" zurück

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Wenn du eine Excel-Anwendung im Rücken hast, kannst du es auch durch die berechnen lassen

    VB.NET-Quellcode

    1. Function ExcelCol(AddressString as String) As Integer
    2. Return CInt(Excel.Range(AddressString).Address(ReferenceStyle:=xlR1C1).Split("C"c)(1))
    3. End Function

    Oder rückwärts

    VB.NET-Quellcode

    1. ​Function ExcelAddress(Row As Integer, Col As Integer) As String
    2. Return Excel.Cells(Row, Col).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    3. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Aus lizenzrechtlichen Gründen verwende ich die 5er Versionen nicht. Allerdings weiß ich auch nicht, ob die 4.5.3.3 (letzte Version unter alter Lizenz) die Funktion unterstützt.
    Ich probier das aber mal aus, danke für den Hinweis.

    Nachtrag: Ja hast recht, auch in der von mir verwendeten Version gibts das schon, das mit der API Dokumentation habe ich tatsächlich nie gefunden.....

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dksksm“ ()