Jak przekonwertować liczbę liczbową na nazwę kolumny Excel w C # bez korzystania z automatyzacji pobierania wartości bezpośrednio z Excela.
Excel 2007 ma możliwy zakres od 1 do 16384, czyli liczbę obsługiwanych kolumn. Otrzymane wartości powinny mieć postać nazw kolumn programu Excel, np. A, AA, AAA itp.
Odpowiedzi:
Oto jak to robię:
źródło
StringBuilder
. Trwa to około dwa razy dłużej. Jest to bardzo krótki ciąg (maks. 3 znaki - Excel 2010 przechodzi do kolumny XFD), więc maksymalnie 2 ciągi łączące. (Użyłem 100 iteracji translacji liczb całkowitych 1 na 16384, tj. Kolumn Excela A na XFD, jako testu).modulo
, zadzwońToString()
i zastosuj(int)
. Biorąc pod uwagę, że w większości przypadków w świecie C # zacząłbyś numerować od 0, oto moja wersja: <! - język: c # -> publiczny ciąg statyczny GetColumnName (indeks wewnętrzny) // bazujący na zerach {const byte BASE = 'Z „-„ A ”+ 1; nazwa ciągu = String.Empty; do {name = Convert.ToChar ('A' + index% BASE) + name; indeks = indeks / PODSTAWA - 1; } while (indeks> = 0); zwracane imię; }Jeśli ktoś musi to zrobić w programie Excel bez VBA, oto sposób:
gdzie colNum jest numerem kolumny
A w VBA:
źródło
Niestety, to jest Python zamiast C #, ale przynajmniej wyniki są poprawne:
źródło
Może być konieczna konwersja w obie strony, np. Z adresu kolumny programu Excel, takiego jak AAZ, na liczbę całkowitą oraz z dowolnej liczby całkowitej do programu Excel. Dwie metody poniżej tego dokonają. Przyjmuje, że indeksowanie oparte jest na 1, pierwszym elementem w „tablicach” jest element nr 1. Brak ograniczeń rozmiaru, więc możesz używać adresów takich jak BŁĄD, a byłby to numer kolumny 2613824 ...
źródło
Odkryłem błąd w moim pierwszym poście, więc postanowiłem usiąść i wykonać matematykę. Odkryłem, że system liczbowy używany do identyfikacji kolumn Excela nie jest systemem podstawowym 26, jak napisała inna osoba. Zastanów się, co następuje w podstawie 10. Możesz to również zrobić z literami alfabetu.
Spacja: ......................... S1, S2, S3: S1, S2, S3
............ ....................... 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ......................…,…,…: ..…,…,…
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Suma stanów w przestrzeni: 10, 100, 1000: 26, 676, 17576
Ogółem państwa: ........... 1110 ............... 18278
Kolumny z liczbami Excela w poszczególnych przestrzeniach alfabetycznych przy użyciu podstawy 26. Widać, że ogólnie postęp przestrzeni stanów jest a, a ^ 2, a ^ 3,… dla pewnej podstawy a, a całkowita liczba stanów to ^ 2 + a ^ 3 +…
Załóżmy, że chcesz znaleźć całkowitą liczbę stanów A w pierwszych N odstępach. Wzór na to: A = (a) (a ^ N - 1) / (a-1). Jest to ważne, ponieważ musimy znaleźć przestrzeń N, która odpowiada naszemu indeksowi K. Jeśli chcę dowiedzieć się, gdzie K leży w systemie liczbowym, muszę zastąpić A literą K i rozwiązać dla N. Rozwiązanie to N = log { base a} (A (a-1) / a +1). Jeśli użyję przykładu a = 10 i K = 192, wiem, że N = 2.23804…. To mówi mi, że K leży na początku trzeciej przestrzeni, ponieważ jest nieco większa niż dwa.
Następnym krokiem jest ustalenie, jak daleko jesteśmy w obecnej przestrzeni. Aby to znaleźć, odejmij od K A wygenerowanego za pomocą podłogi N. W tym przykładzie podłoga N wynosi dwa. Tak więc A = (10) (10 ^ 2 - 1) / (10-1) = 110, jak można się spodziewać po połączeniu stanów dwóch pierwszych spacji. Należy to odjąć od K, ponieważ te pierwsze 110 stanów zostałoby już uwzględnione w pierwszych dwóch spacjach. Pozostaje nam 82 państwa. Tak więc w tym systemie liczb reprezentacja 192 w bazie 10 to 082.
Kod C # przy użyciu podstawowego indeksu wynosi zero
// Stary post
Rozwiązanie zerowe w języku C #.
źródło
Aktualizacja : Komentarz Petera jest słuszny. To właśnie otrzymuję za pisanie kodu w przeglądarce. :-) Moje rozwiązanie nie kompilowało się, brakowało mu lewej litery i budował ciąg w odwrotnej kolejności - wszystko teraz naprawione.
Pomijając błędy, algorytm zasadniczo konwertuje liczbę z bazy 10 na bazę 26.
Aktualizacja 2 : Joel Coehoorn ma rację - powyższy kod zwróci AB dla 27. Gdyby to była prawdziwa podstawowa liczba 26, AA byłaby równa A, a następna liczba po Z byłaby BA.
źródło
Łatwe z rekurencją.
źródło
Po prostu wrzucenie prostej dwuliniowej implementacji C # przy użyciu rekurencji, ponieważ wszystkie odpowiedzi tutaj wydają się znacznie bardziej skomplikowane niż to konieczne.
źródło
..I przekonwertowane na php:
źródło
ord('A')
zamiast 65.Dziwi mnie, że wszystkie dotychczasowe rozwiązania zawierają iterację lub rekurencję.
Oto moje rozwiązanie, które działa w stałym czasie (bez pętli). To rozwiązanie działa dla wszystkich możliwych kolumn Excela i sprawdza, czy dane wejściowe można przekształcić w kolumnę Excela. Możliwe kolumny mieszczą się w zakresie [A, XFD] lub [1, 16384]. (Zależy to od twojej wersji Excela)
źródło
int
s, wynikowa nazwa kolumny mogłaby być dowolnie długa (na przykład w przypadku odpowiedzi na python)Ta odpowiedź jest w języku Java:
źródło
To samo wdrożenie w Javie
źródło
Po przejrzeniu wszystkich dostarczonych wersji tutaj, postanowiłem zrobić je sam, używając rekurencji.
Oto moja wersja vb.net:
źródło
Trochę późno do gry, ale oto kod, którego używam (w C #):
źródło
IndexOf
jest dość powolny, lepiej wstępnie wyrównaj odwrotne mapowanie.Chciałem dodać klasę statyczną, której używam, do interakcji między indeksem col a col Label. Używam zmodyfikowanej zaakceptowanej odpowiedzi dla mojej metody ColumnLabel
Użyj tego jak ...
źródło
jeśli chcesz go tylko dla formuły komórkowej bez kodu, oto formuła dla niego:
źródło
W Delphi (Pascal):
źródło
Nie jest to dokładnie podstawa 26, w systemie nie ma 0. Jeśli tak, po „Z” następuje „BA”, a nie „AA”.
źródło
W perlu, dla wejścia 1 (A), 27 (AA) itp.
źródło
Udoskonalenie oryginalnego rozwiązania (w języku C #):
źródło
Oto wersja ActionScript:
źródło
Rozwiązanie JavaScript
źródło
Te moje kody do konwersji określonej liczby (indeks zaczynają się od 1) do kolumny Excel.
Mój test jednostkowy:
źródło
Chociaż jestem spóźniony do gry, odpowiedź Grahama daleka jest od optymizmu. W szczególności nie musisz używać obsady
modulo
, zadzwońToString()
i zastosuj(int)
. Biorąc pod uwagę, że w większości przypadków w świecie C # zacząłbyś numerować od 0, oto moja wersja:źródło
Kolejny sposób VBA
źródło
Oto moja bardzo późna implementacja w PHP. Ten jest rekurencyjny. Napisałem to tuż przed znalezieniem tego postu. Chciałem sprawdzić, czy inni już rozwiązali ten problem ...
źródło
Próbuję zrobić to samo w Javie ... Napisałem następujący kod:
Teraz, gdy uruchomię go z columnNumber = 29, daje mi wynik = „CA” (zamiast „AC”) jakieś komentarze, których mi brakuje? Wiem, że mogę odwrócić to przez StringBuilder .... Ale patrząc na odpowiedź Grahama, jestem trochę zdezorientowany ...
źródło
columnName = Convert.ToChar(65 + modulo).ToString() + columnName
(tj. Wartość + ColName). Hasan mówi:columnName += val;
(tj. ColName + wartość)columnName = columnName + val
.Zgodna i elegancka wersja Ruby :
źródło
To pytanie, na które przekierowują wszystkie inne osoby, a także Google, więc zamieszczam to tutaj.
Wiele z tych odpowiedzi jest poprawnych, ale zbyt skomplikowanych w prostych sytuacjach, na przykład gdy nie masz więcej niż 26 kolumn. Jeśli masz jakiekolwiek wątpliwości, czy możesz przejść do kolumn z podwójnymi znakami, zignoruj tę odpowiedź, ale jeśli jesteś pewien, że nie, możesz to zrobić tak prosto jak w C #:
Cholera, jeśli masz pewność co do tego, co przekazujesz, możesz nawet usunąć weryfikację i użyć tego:
Będzie to bardzo podobne w wielu językach, więc możesz go dostosować w razie potrzeby.
Ponownie używaj tego tylko, jeśli masz 100% pewności, że nie będziesz miał więcej niż 26 kolumn .
źródło
Dzięki za odpowiedzi tutaj !! pomógł mi wymyślić te funkcje pomocnicze do interakcji z interfejsem API Arkuszy Google, nad którymi pracuję w Elixir / Phoenix
oto, co wymyśliłem (prawdopodobnie użyłbym dodatkowej weryfikacji i obsługi błędów)
W eliksir:
I funkcja odwrotna:
I niektóre testy:
źródło