Bagaimana Anda mengonversi angka numerik ke nama kolom Excel di C # tanpa menggunakan otomatisasi mendapatkan nilai langsung dari Excel.
Excel 2007 memiliki kisaran 1 hingga 16384, yang merupakan jumlah kolom yang didukungnya. Nilai yang dihasilkan harus dalam bentuk nama kolom excel, misalnya A, AA, AAA dll.
Jawaban:
Begini cara saya melakukannya:
sumber
StringBuilder
. Butuh sekitar dua kali lebih lama. Ini adalah string yang sangat singkat (maks. 3 karakter - Excel 2010 naik ke kolom XFD), jadi maksimum 2 rangkaian string. (Saya menggunakan 100 iterasi untuk menerjemahkan bilangan bulat 1 hingga 16384, yaitu kolom Excel A ke XFD, sebagai tes).modulo
, memanggilToString()
dan menerapkan(int)
pemeran. Mempertimbangkan bahwa dalam kebanyakan kasus di dunia C # Anda akan mulai penomoran dari 0, inilah revisi saya: <! - bahasa: c # -> public static string GetColumnName (int index) // berbasiskan nol {const byte BASE = 'Z '-' A '+ 1; string name = String.Empty; do {name = Convert.ToChar ('A' + index% BASE) + nama; index = index / BASE - 1; } while (index> = 0); nama kembali; }Jika ada yang perlu melakukan ini di Excel tanpa VBA, berikut ini caranya:
di mana colNum adalah nomor kolom
Dan di VBA:
sumber
Maaf, ini Python bukan C #, tetapi setidaknya hasilnya benar:
sumber
Anda mungkin perlu konversi kedua arah, misalnya dari alamat kolom Excel seperti AAZ ke integer dan dari integer apa pun ke Excel. Dua metode di bawah ini akan melakukan hal itu. Asumsikan 1 pengindeksan berbasis, elemen pertama dalam "array" Anda adalah elemen nomor 1. Tidak ada batasan pada ukuran di sini, sehingga Anda dapat menggunakan alamat seperti ERROR dan itu akan menjadi nomor kolom 2613824 ...
sumber
Saya menemukan kesalahan dalam posting pertama saya, jadi saya memutuskan untuk duduk dan melakukan perhitungan. Apa yang saya temukan adalah bahwa sistem angka yang digunakan untuk mengidentifikasi kolom Excel bukanlah sistem basis 26, seperti yang diposkan orang lain. Pertimbangkan hal-hal berikut dalam basis 10. Anda juga dapat melakukan ini dengan huruf-huruf alfabet.
Spasi: ......................... S1, S2, S3: S1, S2, S3
............ ........................ 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ...................... ..., ..., ...: .. ..., ..., ...
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Total status dalam ruang: 10, 100, 1000: 26, 676, 17576
Total Negara: ............... 1110 ................ 18278
Kolom angka Excel dalam spasi alfabet individual menggunakan basis 26. Anda dapat melihat bahwa secara umum, perkembangan ruang keadaan adalah a, a ^ 2, a ^ 3, ... untuk beberapa basis a, dan jumlah total state adalah a + a ^ 2 + a ^ 3 +….
Misalkan Anda ingin menemukan jumlah total negara bagian A dalam ruang N pertama. Rumus untuk melakukannya adalah A = (a) (a ^ N - 1) / (a-1). Ini penting karena kita perlu menemukan ruang N yang sesuai dengan indeks kita K. Jika saya ingin mencari tahu di mana K terletak pada sistem angka saya perlu mengganti A dengan K dan menyelesaikannya untuk N. Solusinya adalah N = log { base a} (A (a-1) / a +1). Jika saya menggunakan contoh a = 10 dan K = 192, saya tahu bahwa N = 2.23804…. Ini memberitahu saya bahwa K terletak di awal ruang ketiga karena sedikit lebih besar dari dua.
Langkah selanjutnya adalah menemukan dengan tepat seberapa jauh jarak kita saat ini. Untuk menemukan ini, kurangi dari K a yang dihasilkan menggunakan lantai N. Dalam contoh ini, lantai N adalah dua. Jadi, A = (10) (10 ^ 2 - 1) / (10-1) = 110, seperti yang diharapkan ketika Anda menggabungkan keadaan dari dua spasi pertama. Ini perlu dikurangi dari K karena 110 negara bagian pertama ini sudah diperhitungkan dalam dua ruang pertama. Ini membuat kita memiliki 82 negara. Jadi, dalam sistem bilangan ini, representasi 192 dalam basis 10 adalah 082.
Kode C # menggunakan indeks dasar nol adalah
// Old Post
Solusi berbasis nol di C #.
sumber
Pembaruan : Komentar Peter benar. Itulah yang saya dapatkan untuk menulis kode di browser. :-) Solusi saya tidak mengkompilasi, itu kehilangan surat paling kiri dan sedang membangun string dalam urutan terbalik - semua sekarang diperbaiki.
Selain bug, algoritma ini pada dasarnya mengubah angka dari basis 10 ke basis 26.
Pembaruan 2 : Joel Coehoorn benar - kode di atas akan mengembalikan AB untuk 27. Jika itu nomor basis nyata 26, AA akan sama dengan A dan nomor berikutnya setelah Z akan menjadi BA.
sumber
Mudah dengan rekursi.
sumber
Hanya melempar implementasi C # dua baris sederhana menggunakan rekursi, karena semua jawaban di sini tampaknya jauh lebih rumit daripada yang diperlukan.
sumber
..Dan dikonversi ke php:
sumber
ord('A')
sebagai ganti 65.Saya terkejut semua solusi sejauh ini mengandung iterasi atau rekursi.
Inilah solusi saya yang berjalan dalam waktu yang konstan (tanpa loop). Solusi ini berfungsi untuk semua kolom Excel yang mungkin dan memeriksa apakah input dapat diubah menjadi kolom Excel. Kolom yang mungkin ada dalam kisaran [A, XFD] atau [1, 16384]. (Ini tergantung pada versi Excel Anda)
sumber
int
s, nama kolom yang dihasilkan bisa panjang sembarangan (misalnya kasus jawaban python, misalnya)Jawaban ini dalam javaScript:
sumber
Implementasi yang sama di Jawa
sumber
Setelah melihat semua Versi yang disediakan di sini, saya memutuskan untuk melakukannya sendiri, menggunakan rekursi.
Ini Versi vb.net saya:
sumber
Sedikit terlambat ke gim, tapi inilah kode yang saya gunakan (dalam C #):
sumber
IndexOf
cukup lambat, lebih baik Anda precalcuate pemetaan terbalik.Saya ingin melempar di kelas statis saya gunakan, untuk interoping antara indeks col dan Label col. Saya menggunakan jawaban yang diterima yang dimodifikasi untuk Metode ColumnLabel saya
Gunakan ini seperti ...
sumber
jika Anda hanya menginginkannya untuk formula sel tanpa kode, berikut ini rumus untuknya:
sumber
Dalam Delphi (Pascal):
sumber
Ini bukan basis 26, tidak ada 0 dalam sistem. Jika ada, 'Z' akan diikuti oleh 'BA' bukan oleh 'AA'.
sumber
Dalam perl, untuk input 1 (A), 27 (AA), dll.
sumber
Menyempurnakan solusi asli (dalam C #):
sumber
Ini adalah versi Actionscript:
sumber
Solusi JavaScript
sumber
Ini kode saya untuk mengonversi angka tertentu (indeks mulai dari 1) ke Kolom Excel.
Tes Unit Saya:
sumber
Meskipun saya terlambat ke permainan, jawaban Graham masih jauh dari optimal. Khususnya, Anda tidak harus menggunakan
modulo
, memanggilToString()
dan melamar(int)
. Menimbang bahwa dalam kebanyakan kasus di dunia C # Anda akan mulai memberi penomoran mulai dari 0, inilah revisi saya:sumber
Cara VBA lain
sumber
Inilah implementasi saya yang sangat terlambat di PHP. Yang ini bersifat rekursif. Saya menulisnya tepat sebelum saya menemukan posting ini. Saya ingin melihat apakah orang lain sudah menyelesaikan masalah ini ...
sumber
Saya mencoba melakukan hal yang sama di Jawa ... Saya telah menulis kode berikut:
Sekarang setelah saya menjalankannya dengan columnNumber = 29, itu memberi saya hasil = "CA" (bukannya "AC") ada komentar apa yang saya lewatkan? Saya tahu saya bisa membalikkannya dengan StringBuilder .... Tetapi melihat jawaban Graham, saya agak bingung ....
sumber
columnName = Convert.ToChar(65 + modulo).ToString() + columnName
(yaitu nilai + ColName). Hasan mengatakan:columnName += val;
(yaitu nilai ColName +)columnName = columnName + val
.Versi Ruby yang bertepatan dan elegan :
sumber
Ini adalah pertanyaan yang diajukan semua orang dan juga Google, jadi saya memposting ini di sini.
Banyak dari jawaban ini yang benar tetapi terlalu rumit untuk situasi sederhana seperti ketika Anda tidak memiliki lebih dari 26 kolom. Jika Anda ragu apakah Anda akan masuk ke kolom karakter ganda kemudian abaikan jawaban ini, tetapi jika Anda yakin tidak akan melakukannya, maka Anda bisa melakukannya sesederhana ini di C #:
Heck, jika Anda yakin tentang apa yang Anda sampaikan, Anda bahkan dapat menghapus validasi dan menggunakan inline ini:
Ini akan sangat mirip dalam banyak bahasa sehingga Anda dapat menyesuaikannya sesuai kebutuhan.
Sekali lagi, hanya gunakan ini jika Anda 100% yakin Anda tidak akan memiliki lebih dari 26 kolom .
sumber
Terima kasih atas jawabannya di sini !! membantu saya menemukan fungsi pembantu ini untuk beberapa interaksi dengan Google Sheets API yang saya kerjakan di Elixir / Phoenix
inilah yang saya buat (mungkin bisa menggunakan beberapa validasi dan penanganan kesalahan tambahan)
Dalam Elixir:
Dan fungsi terbalik:
Dan beberapa tes:
sumber