Wie konvertieren Sie eine numerische Zahl in einen Excel-Spaltennamen in C #, ohne die Automatisierung zu verwenden, um den Wert direkt aus Excel abzurufen?
Excel 2007 hat einen möglichen Bereich von 1 bis 16384, dh die Anzahl der unterstützten Spalten. Die resultierenden Werte sollten in Form von Excel-Spaltennamen vorliegen, z. B. A, AA, AAA usw.
Antworten:
So mache ich das:
quelle
StringBuilder
. Es dauert ungefähr doppelt so lange. Es ist eine sehr kurze Zeichenfolge (maximal 3 Zeichen - Excel 2010 geht bis zur Spalte XFD), also maximal 2 Zeichenfolgenverkettungen. (Ich habe 100 Iterationen der Übersetzung der ganzen Zahlen 1 bis 16384, dh der Excel-Spalten A bis XFD, als Test verwendet).modulo
, aufrufenToString()
und anwenden(int)
. In Anbetracht der Tatsache, dass Sie in der C # -Welt in den meisten Fällen mit der Nummerierung von 0 beginnen würden, ist hier meine Revision: <! - Sprache: c # -> öffentliche statische Zeichenfolge GetColumnName (int index) // nullbasiert {const byte BASE = 'Z. '-' A '+ 1; string name = String.Empty; do {name = Convert.ToChar ('A' + Index% BASE) + Name; index = index / BASE - 1; } while (Index> = 0); Name zurückgeben; }Wenn jemand dies in Excel ohne VBA tun muss, gibt es folgende Möglichkeiten:
Dabei ist colNum die Spaltennummer
Und in VBA:
quelle
Entschuldigung, dies ist Python anstelle von C #, aber zumindest die Ergebnisse sind korrekt:
quelle
Möglicherweise müssen Sie in beide Richtungen konvertieren, z. B. von einer Excel-Spaltenadresse wie AAZ in eine Ganzzahl und von einer beliebigen Ganzzahl in Excel. Die beiden folgenden Methoden werden genau das tun. Angenommen, eine 1-basierte Indizierung ist das erste Element in Ihren "Arrays" Element Nummer 1. Hier gibt es keine Größenbeschränkungen. Sie können also Adressen wie ERROR verwenden, und das wäre die Spaltennummer 2613824 ...
quelle
Ich habe in meinem ersten Beitrag einen Fehler entdeckt und mich entschlossen, mich hinzusetzen und zu rechnen. Was ich gefunden habe, ist, dass das Zahlensystem, das zur Identifizierung von Excel-Spalten verwendet wird, kein Basissystem ist, wie eine andere Person geschrieben hat. Beachten Sie Folgendes in Basis 10. Sie können dies auch mit den Buchstaben des Alphabets tun.
Leerzeichen: ......................... S1, S2, S3: S1, S2, S3
............ ........................ 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ......................…,…,…: ..…,…,…
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Gesamtzustände im Raum: 10, 100, 1000: 26, 676, 17576
Gesamtzustände: ............... 1110 ................ 18278
Excel-Zahlenspalten in den einzelnen alphabetischen Räumen unter Verwendung der Basis 26. Sie können sehen, dass der Fortschreiten des Zustandsraums im Allgemeinen a, a ^ 2, a ^ 3,… für einige Basis a ist und die Gesamtzahl der Zustände a + a ist ^ 2 + a ^ 3 +….
Angenommen, Sie möchten die Gesamtzahl der Zustände A in den ersten N Feldern ermitteln. Die Formel dafür lautet A = (a) (a ^ N - 1) / (a-1). Dies ist wichtig, weil wir den Raum N finden müssen, der unserem Index K entspricht. Wenn ich herausfinden will, wo K im Zahlensystem liegt, muss ich A durch K ersetzen und nach N lösen. Die Lösung ist N = log { Basis a} (A (a-1) / a +1). Wenn ich das Beispiel von a = 10 und K = 192 verwende, weiß ich, dass N = 2.23804…. Dies sagt mir, dass K am Anfang des dritten Feldes liegt, da es etwas größer als zwei ist.
Der nächste Schritt besteht darin, genau herauszufinden, wie weit wir uns im aktuellen Raum befinden. Um dies zu finden, subtrahieren Sie von K das A, das unter Verwendung des Bodens von N erzeugt wurde. In diesem Beispiel ist der Boden von N zwei. Also ist A = (10) (10 ^ 2 - 1) / (10-1) = 110, wie erwartet, wenn Sie die Zustände der ersten beiden Räume kombinieren. Dies muss von K subtrahiert werden, da diese ersten 110 Zustände bereits in den ersten beiden Räumen berücksichtigt worden wären. Dies lässt uns mit 82 Staaten. In diesem Zahlensystem ist die Darstellung von 192 in Basis 10 also 082.
Der C # -Code mit einem Basisindex von Null ist
// Alter Beitrag
Eine auf Null basierende Lösung in C #.
quelle
Update : Peters Kommentar ist richtig. Das bekomme ich zum Schreiben von Code im Browser. :-) Meine Lösung wurde nicht kompiliert, es fehlte der Buchstabe ganz links und es wurde die Zeichenfolge in umgekehrter Reihenfolge erstellt - alles jetzt behoben.
Abgesehen von Fehlern konvertiert der Algorithmus im Grunde genommen eine Zahl von Basis 10 in Basis 26.
Update 2 : Joel Coehoorn hat recht - der obige Code gibt AB für 27 zurück. Wenn es eine echte Basis-26-Zahl wäre, wäre AA gleich A und die nächste Zahl nach Z wäre BA.
quelle
Einfach mit Rekursion.
quelle
Wirf einfach eine einfache zweizeilige C # -Implementierung mithilfe der Rekursion ein, da alle Antworten hier weitaus komplizierter als nötig erscheinen.
quelle
..Und konvertiert zu PHP:
quelle
ord('A')
anstelle von 65.Ich bin überrascht, dass alle bisherigen Lösungen entweder Iteration oder Rekursion enthalten.
Hier ist meine Lösung, die in konstanter Zeit läuft (keine Schleifen). Diese Lösung funktioniert für alle möglichen Excel-Spalten und überprüft, ob die Eingabe in eine Excel-Spalte umgewandelt werden kann. Mögliche Spalten liegen im Bereich [A, XFD] oder [1, 16384]. (Dies hängt von Ihrer Excel-Version ab.)
quelle
int
s verwenden, könnte der resultierende Spaltenname beliebig lang sein (das ist zum Beispiel bei der Python-Antwort der Fall)Diese Antwort ist in JavaScript:
quelle
Gleiche Implementierung in Java
quelle
Nachdem ich mir alle hier gelieferten Versionen angesehen hatte, entschloss ich mich, selbst eine mit Rekursion zu erstellen.
Hier ist meine vb.net Version:
quelle
Ein bisschen spät zum Spiel, aber hier ist der Code, den ich benutze (in C #):
quelle
IndexOf
ist ziemlich langsam, Sie sollten die umgekehrte Zuordnung besser vorberechnen.Ich wollte meine statische Klasse einfügen, die ich zum Interoping zwischen col index und col Label verwende. Ich verwende eine modifizierte akzeptierte Antwort für meine ColumnLabel-Methode
Verwenden Sie dies wie ...
quelle
Wenn Sie es nur für eine Zellenformel ohne Code möchten, finden Sie hier eine Formel dafür:
quelle
In Delphi (Pascal):
quelle
Es ist nicht genau Basis 26, es gibt keine 0 im System. Wenn dies der Fall wäre, würde auf 'Z' 'BA' und nicht 'AA' folgen.
quelle
In Perl für eine Eingabe von 1 (A), 27 (AA) usw.
quelle
Verfeinern der ursprünglichen Lösung (in C #):
quelle
Hier ist eine Actionscript-Version:
quelle
JavaScript-Lösung
quelle
Diese meine Codes zum Konvertieren einer bestimmten Nummer (Index beginnt bei 1) in eine Excel-Spalte.
Mein Unit Test:
quelle
Obwohl ich zu spät zum Spiel komme , ist Grahams Antwort alles andere als optimal. Insbesondere müssen Sie die Besetzung nicht
modulo
aufrufen, aufrufenToString()
und anwenden(int)
. In Anbetracht der Tatsache, dass Sie in der C # -Welt in den meisten Fällen mit der Nummerierung von 0 beginnen würden, ist hier meine Überarbeitung:quelle
Ein anderer VBA-Weg
quelle
Hier ist meine super späte Implementierung in PHP. Dieser ist rekursiv. Ich habe es geschrieben, kurz bevor ich diesen Beitrag gefunden habe. Ich wollte sehen, ob andere dieses Problem bereits gelöst hatten ...
quelle
Ich versuche dasselbe in Java zu tun ... Ich habe folgenden Code geschrieben:
Sobald ich es mit columnNumber = 29 ausgeführt habe, erhalte ich das Ergebnis = "CA" (anstelle von "AC"). Gibt es Kommentare, was mir fehlt? Ich weiß, dass ich es mit StringBuilder umkehren kann ... Aber wenn ich mir die Antwort von Graham ansehe, bin ich ein wenig verwirrt ...
quelle
columnName = Convert.ToChar(65 + modulo).ToString() + columnName
(dh Wert + ColName). Hasan sagt:columnName += val;
(dh ColName + Wert)columnName = columnName + val
.Coincise und elegante Ruby- Version:
quelle
Dies ist die Frage, zu der alle anderen sowie Google umleiten, also poste ich dies hier.
Viele dieser Antworten sind richtig, aber für einfache Situationen zu umständlich, z. B. wenn Sie nicht über 26 Spalten verfügen. Wenn Sie Zweifel haben, ob Sie in Doppelzeichenspalten gehen könnten, ignorieren Sie diese Antwort. Wenn Sie jedoch sicher sind, dass dies nicht der Fall ist, können Sie dies in C # so einfach tun:
Wenn Sie sich sicher sind, was Sie übergeben, können Sie sogar die Validierung entfernen und diese Inline verwenden:
Dies ist in vielen Sprachen sehr ähnlich, sodass Sie es nach Bedarf anpassen können.
Verwenden Sie diese Option nur, wenn Sie zu 100% sicher sind, dass Sie nicht mehr als 26 Spalten haben .
quelle
Danke für die Antworten hier !! hat mir geholfen, diese Hilfsfunktionen für die Interaktion mit der Google Sheets-API zu entwickeln, an der ich in Elixir / Phoenix arbeite
Hier ist, was ich mir ausgedacht habe (könnte wahrscheinlich eine zusätzliche Validierung und Fehlerbehandlung gebrauchen)
In Elixir:
Und die Umkehrfunktion:
Und einige Tests:
quelle