কীভাবে একটি কলাম নম্বর (যেমন 127) একটি এক্সেল কলামে রূপান্তর করবেন (যেমন এএ)


474

আপনি এক্সেল থেকে সরাসরি মান না পেয়ে অটোমেশন ব্যবহার না করে আপনি কীভাবে সি # তে একটি এক্সেল কলামের নামতে একটি সংখ্যাসূচক সংখ্যাকে রূপান্তর করবেন।

এক্সেল 2007 এর 1 থেকে 16384 এর সম্ভাব্য ব্যাপ্তি রয়েছে যা এটি সমর্থন করে এমন কলামগুলির সংখ্যা। ফলস্বরূপ মানগুলি এক্সেল কলামের নামগুলিতে হওয়া উচিত, যেমন এ, এএ, এএএ ইত্যাদি etc.


1
ভুলে যাবেন না যে উপলব্ধ কলামগুলির সংখ্যার সীমা রয়েছে। যেমন * এক্সেল 2003 (ভি 11) IV, 2 ^ 8 বা 256 কলামে যায়)। * এক্সেল 2007 (ভি 12) এক্সএফডি, 2 ^ 14 বা 16384 কলামে যায়।
অপ্রকাশিত


এই প্রশ্নটি সি # এবং ট্যাগ রয়েছে। আমি এই প্রশ্নটিকে পুরানো হিসাবে পতাকাঙ্কিত করেছি, কারণ আমরা ২০১ 2016 সালে থাকি এবং ইপিপিএলএস রয়েছে । সার্ভারে উন্নত এক্সেল স্প্রেডশিট তৈরি করতে সাধারণত ব্যবহৃত সি # লাইব্রেরি। যা জিএনইউ লাইব্রেরি জেনারেল পাবলিক লাইসেন্স (এলজিপিএল) এর অধীনে উপলব্ধ করা হয়েছে। ইপিপ্লাস ব্যবহার করে আপনি সহজেই কলাম স্ট্রিং পেতে পারেন।
টনি_কিলোপাপা মাইকগল্ফ

নোট করুন যে সারি এবং কলাম সীমা ফাইল সংস্করণের জন্য এক্সেল সংস্করণের চেয়ে বেশি নির্ভর করে এবং প্রতিটি ওয়ার্কবুকের জন্য আলাদা হতে পারে। পুরানো বা আরও নতুন ফর্ম্যাটে সংরক্ষণ করা থাকলে তারা একই ওয়ার্কবুকের জন্য এমনকি পরিবর্তন করতে পারে।
স্লাই

উত্তর:


900

আমি এটি কীভাবে করব তা এখানে:

private string GetExcelColumnName(int columnNumber)
{
    int dividend = columnNumber;
    string columnName = String.Empty;
    int modulo;

    while (dividend > 0)
    {
        modulo = (dividend - 1) % 26;
        columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
        dividend = (int)((dividend - modulo) / 26);
    } 

    return columnName;
}

64
এই কোডটি ভাল কাজ করে। এটি ধরে নিয়েছে যে কলাম কলামটি কলামনিম্বার ১। কলামটি নাম্বার হিসাবে কলাম এ ব্যবহার করে আমার সিস্টেমে অ্যাকাউন্টে তাত্ক্ষণিক পরিবর্তন আনতে হবে I কিথ
কিথ সিরমন্স 18

14
@ জডুভ কেবল এটি ব্যবহার করে চেষ্টা করেছেন StringBuilder। এটি প্রায় দ্বিগুণ সময় নেয়। এটি একটি খুব সংক্ষিপ্ত স্ট্রিং (সর্বাধিক 3 টি অক্ষর - এক্সেল 2010 কলাম এক্সএফডি পর্যন্ত যায়), তাই সর্বোচ্চ 2 টি স্ট্রিং কনটেন্টেশন। (আমি পরীক্ষাটি হিসাবে পূর্ণসংখ্যা 1 থেকে 16384, এক্সেল কলাম এ থেকে এক্সএফডি পর্যন্ত অনুবাদ করার 100 টি পুনরাবৃত্তি ব্যবহার করেছি)।
গ্রাহাম

18
আরও ভাল বোঝার জন্য, আমি 65-কে 'এ' দিয়ে প্রতিস্থাপন করব
স্টিফ হেইনারথ

11
আমি মনে করি 65৫ এর পরিবর্তে 'এ' ব্যবহার করা ভাল 26
ডেনিস গ্ল্যাডকি

5
যদিও আমি গেমটি করতে দেরি করেছি, কোডটি সর্বোত্তম হওয়া থেকে খুব দূরে icular বিশেষত, আপনাকে moduloকল, কল ToString()এবং প্রয়োগ প্রয়োগ করতে হবে না (int)। সি # বিশ্বে বেশিরভাগ ক্ষেত্রে আপনি 0 থেকে সংখ্যায়ন শুরু করবেন তা বিবেচনা করে, এখানে আমার সংশোধন: <! - ভাষা: সি # -> পাবলিক স্ট্যাটিক স্ট্রিং গেটকুলননাম (ইনড ইনডেক্স) // শূন্য-ভিত্তিক {কনস্ট বাইট বিএএসই = 'জেড '-' এ '+ 1; স্ট্রিং নাম = স্ট্রিং.এম্পটি; do {name = রূপান্তর করুন o টোচর ('এ' + সূচক% বেস) + নাম; সূচক = সূচক / বেস - 1; } যখন (সূচক> = 0); প্রত্যাবর্তনের নাম; }
হারমান কান

63

কারও যদি ভিবিএ ছাড়াই এক্সেলের মাধ্যমে এটি করার প্রয়োজন হয় তবে এখানে একটি উপায়:

=SUBSTITUTE(ADDRESS(1;colNum;4);"1";"")

যেখানে কলনাম হল কলাম নম্বর number

এবং ভিবিএতে:

Function GetColumnName(colNum As Integer) As String
    Dim d As Integer
    Dim m As Integer
    Dim name As String
    d = colNum
    name = ""
    Do While (d > 0)
        m = (d - 1) Mod 26
        name = Chr(65 + m) + name
        d = Int((d - m) / 26)
    Loop
    GetColumnName = name
End Function

2
উদাহরণ: = সাবস্টিটিউট (পাঠ্য (ঠিকানা) (1,1000,4), ""), "1", "")
ডল্ফ

হ্যাঁ, আমি একটি লোকেলতে এক্সেল ব্যবহার করি; এক্সেলে ফাংশন আর্গুমেন্ট পৃথক করতে, এর জায়গায় ব্যবহার করা হয়। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ.
vzczc

2
আমি এটি পাঠ্য ফাংশন ছাড়াই করেছি। টেক্সট ফাংশনটির উদ্দেশ্য কী?
দিনুলি

2
@dayuloli দীর্ঘদিন থেকে এই উত্তরটি লেখা হয়েছিল, আপনি সঠিক, পাঠ্য ফাংশনটি এখানে কোনও উদ্দেশ্য করে না। উত্তর আপডেট করবে।
vzczc

21

দুঃখিত, এটি সি # এর পরিবর্তে পাইথন, তবে কমপক্ষে ফলাফলগুলি সঠিক:

def ColIdxToXlName(idx):
    if idx < 1:
        raise ValueError("Index is too small")
    result = ""
    while True:
        if idx > 26:
            idx, r = divmod(idx - 1, 26)
            result = chr(r + ord('A')) + result
        else:
            return chr(idx + ord('A') - 1) + result


for i in xrange(1, 1024):
    print "%4d : %s" % (i, ColIdxToXlName(i))

হ্যাঁ আমি নিচে ভোট দিয়েছি, প্রশ্নটি সি # হলে পাইথন পোস্ট করবেন না। এবং হ্যাঁ, আরও বেশি লোকের এটি করা উচিত।
কিলোরেন

1
প্রশ্নের শিরোনাম সি # বোঝায় না, তাই অনেক লোক এখানে আসতে পারেন যারা সি # কে ছাড়েন না। তাই পাইথনে ভাগ করে নেওয়ার জন্য ধন্যবাদ!
টিম-এরউইন

20

আপনার উভয় উপায়ে রূপান্তর প্রয়োজন হতে পারে, যেমন এএজেডের মতো এক্সেল কলাম অ্যাড্রেস থেকে পূর্ণসংখ্যার জন্য এবং কোনও পূর্ণসংখ্যা থেকে এক্সেলে রূপান্তর করতে। নীচের দুটি পদ্ধতি কেবল এটি করবে। অনুমান 1 ভিত্তিক সূচক, আপনার "অ্যারে" এর প্রথম উপাদানটি উপাদান নম্বর 1 size আকারের কোনও সীমা নেই, তাই আপনি ERROR এর মতো ঠিকানাগুলি ব্যবহার করতে পারেন এবং এটি কলাম নম্বর 2613824 হবে ...

public static string ColumnAdress(int col)
{
  if (col <= 26) { 
    return Convert.ToChar(col + 64).ToString();
  }
  int div = col / 26;
  int mod = col % 26;
  if (mod == 0) {mod = 26;div--;}
  return ColumnAdress(div) + ColumnAdress(mod);
}

public static int ColumnNumber(string colAdress)
{
  int[] digits = new int[colAdress.Length];
  for (int i = 0; i < colAdress.Length; ++i)
  {
    digits[i] = Convert.ToInt32(colAdress[i]) - 64;
  }
  int mul=1;int res=0;
  for (int pos = digits.Length - 1; pos >= 0; --pos)
  {
    res += digits[pos] * mul;
    mul *= 26;
  }
  return res;
}

13

আমি আমার প্রথম পোস্টে একটি ত্রুটি আবিষ্কার করেছি, তাই আমি বসে বসে গণিতটি করার সিদ্ধান্ত নিয়েছি। আমি যেটা খুঁজে পেয়েছি তা হল যে এক্সেল কলামগুলি সনাক্ত করতে ব্যবহৃত নম্বর সিস্টেমটি কোনও 26 ব্যক্তি পোস্ট করা হিসাবে বেস 26 সিস্টেম নয়। 10 বেসে নিম্নলিখিতটি বিবেচনা করুন আপনি বর্ণমালার অক্ষর দিয়েও এটি করতে পারেন।

স্থান: ......................... এস 1, এস 2, এস 3: এস 1, এস 2, এস 3
............ ........................ 0, 00, 000: .. এ, এএ, এএএ
............. ....................... 1, 01, 001: .. বি, এবি, এএবি
.............. ......................…,…,…: ..…,…,…
............... ..................... 9, 99, 999: .. জেড, জেডজেড, জেডজেডজেড
স্পেসে মোট রাজ্য: 10, 100, 1000: 26, 676, 17576
মোট রাজ্য: ............... 1110 ................ 18278

এক্সেলটি বেস ২ using ব্যবহার করে পৃথক বর্ণানুক্রমিক ফাঁকে কলামগুলিকে সংখ্যার সংখ্যা দেয় can ^ 2 + এ ^ 3 +…।

ধরুন আপনি প্রথম এন স্পেসে মোট রাজ্যের A খুঁজে পেতে চান। এটি করার সূত্রটি হ'ল A = (a) (a ^ N - 1) / (a-1)। এটি গুরুত্বপূর্ণ কারণ আমাদের সূচক কে এর সাথে মিলে আমাদের N স্পেসের সন্ধান করতে হবে I বেস a} (A (a-1) / a +1)। আমি যদি একটি = 10 এবং কে = 192 এর উদাহরণ ব্যবহার করি তবে আমি জানি যে এন = 2.23804…। এটি আমাকে বলে যে কে তৃতীয় স্থানের শুরুতে রয়েছে কারণ এটি দুটি চেয়ে একটু বেশি।

পরবর্তী পদক্ষেপটি হ'ল আমরা বর্তমান স্পেসে ঠিক কতদূর রয়েছি তা সন্ধান করা। এটি সন্ধান করতে N এর মেঝে ব্যবহার করে উত্পন্ন কে-এ থেকে বিয়োগ করুন example উদাহরণস্বরূপ, এন এর তল দুটি। সুতরাং, এ = (10) (10 ^ 2 - 1) / (10-1) = 110, যখন আপনি প্রথম দুটি স্পেসের রাজ্যগুলিকে একত্রিত করবেন তখন যেমন প্রত্যাশা করা হয়। এটি কে থেকে বিয়োগ করা প্রয়োজন কারণ এই প্রথম ১১০ টি রাজ্য ইতিমধ্যে প্রথম দুটি স্পেসের জন্য গণ্য করা হত। এটি আমাদের 82 টি রাজ্যের সাথে ছেড়ে দেয়। সুতরাং, এই সংখ্যা সিস্টেমে, বেস 10-তে 192 এর প্রতিনিধিত্ব 082।

সি # কোডটি শূন্যের একটি বেস সূচক ব্যবহার করে

    private string ExcelColumnIndexToName(int Index)
    {
        string range = string.Empty;
        if (Index < 0 ) return range;
        int a = 26;
        int x = (int)Math.Floor(Math.Log((Index) * (a - 1) / a + 1, a));
        Index -= (int)(Math.Pow(a, x) - 1) * a / (a - 1);
        for (int i = x+1; Index + i > 0; i--)
        {
            range = ((char)(65 + Index % a)).ToString() + range;
            Index /= a;
        }
        return range;
    }

// পুরাতন পোস্ট

সি # তে একটি শূন্য-ভিত্তিক সমাধান।

    private string ExcelColumnIndexToName(int Index)
    {
        string range = "";
        if (Index < 0 ) return range;
        for(int i=1;Index + i > 0;i=0)
        {
            range = ((char)(65 + Index % 26)).ToString() + range;
            Index /= 26;
        }
        if (range.Length > 1) range = ((char)((int)range[0] - 1)).ToString() + range.Substring(1);
        return range;
    }

ওহ, আমি জানি না তবে আমি এই সমাধানটি পছন্দ করি। কিছুই কল্পনাপ্রসূত মাত্র যুক্তি ব্যবহার ভাল না ... প্রোগ্রামার স্তরের জন্য সহজেই পঠনযোগ্য কোড। তবে একটি জিনিস, আমি বিশ্বাস করি যে সি # তে একটি খালি স্ট্রিংকে স্ট্রিং রেঞ্জ = স্ট্রিং.এম্পটি হিসাবে নির্ধারণ করা তার সেরা অনুশীলন;
বেনামে টাইপ

হ্যাঁ, খুব সুন্দর ব্যাখ্যা। তবে আপনি কি কেবলমাত্র এটিও বলতে পারবেন যে এটি 27 ভিত্তি নয়? আপনার ব্যাখ্যা অধ্যয়নকালে এটি দেখায় তবে শীর্ষে একটি দ্রুত উল্লেখ করা কিছু অন্যান্য লোককে কিছুটা সময় সাশ্রয় করতে পারে।
মারিয়াস

10
int nCol = 127;
string sChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string sCol = "";
while (nCol >= 26)
{
    int nChar = nCol % 26;
    nCol = (nCol - nChar) / 26;
    // You could do some trick with using nChar as offset from 'A', but I am lazy to do it right now.
    sCol = sChars[nChar] + sCol;
}
sCol = sChars[nCol] + sCol;

আপডেট : পিটারের মন্তব্য সঠিক। ব্রাউজারে কোড লেখার জন্য আমি এটাই পাই। :-) আমার সমাধানটি সংকলন করছে না, এটি বাম-সর্বাধিক বর্ণটি অনুপস্থিত ছিল এবং এটি বিপরীত ক্রমে স্ট্রিংটি তৈরি করছিল - সব এখন ঠিক।

বাগগুলি বাদ দিয়ে, অ্যালগরিদম মূলত একটি সংখ্যা 10 থেকে বেস 26 তে রূপান্তর করে ting

আপডেট 2 : জোয়েল কোহোর্ন সঠিক - উপরের কোডটি 27-এ AB এবেল it

int nCol = 127;
string sChars = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string sCol = "";
while (nCol > 26)
{
    int nChar = nCol % 26;
    if (nChar == 0)
        nChar = 26;
    nCol = (nCol - nChar) / 26;
    sCol = sChars[nChar] + sCol;
}
if (nCol != 0)
    sCol = sChars[nCol] + sCol;

কোড সংকলন করবে না (এস কোলক আরম্ভ নয়)। যদি তা করে তবে তা সঠিক উত্তর দেবে না।
পিটার

5
এই উত্তরটি ভুল। বেস 26 যথেষ্ট ভাল নয়। জেড থেকে এএতে আপনার মোড়ক পরে কী হবে তা ভেবে দেখুন। যদি A 0 অঙ্ক সমতূল্য, তাহলে এটি যদি আর 1 টি সংখ্যা এর 00 9 থেকে wraping মত, এটি 9 11. থেকে মোড়ানো মত
জোএল Coehoorn

4
আপডেটের পরে আমি পরিষ্কার নই ... আলগোরিদিমগুলির মধ্যে এখন কোনওটিই সঠিক? এবং যদি তাই হয়, কোনটি, দ্বিতীয়টি? আমি এটি সম্পাদনা করব এবং এটি
উত্তরসূরিদের

10

পুনরাবৃত্তি সঙ্গে সহজ।

public static string GetStandardExcelColumnName(int columnNumberOneBased)
{
  int baseValue = Convert.ToInt32('A');
  int columnNumberZeroBased = columnNumberOneBased - 1;

  string ret = "";

  if (columnNumberOneBased > 26)
  {
    ret = GetStandardExcelColumnName(columnNumberZeroBased / 26) ;
  }

  return ret + Convert.ToChar(baseValue + (columnNumberZeroBased % 26) );
}

1
.. বা একটি লুপ। এখানে পুনরাবৃত্তি ব্যবহার করার কোনও আসল কারণ নেই।
ব্লারগবার্ড

1
এটি কেবলমাত্র 26 ভিত্তিতে নয়, তাই পুনরাবৃত্ত সমাধান খুব সহজ।
জোয়েল কোহোর্ন

এই রুটিনটি আসলে কাজ করে না। উদাহরণস্বরূপ, গেটস স্ট্যান্ডার্ডএক্সসেল কলামনাম (২)) @ গেটস স্ট্যান্ডার্ডএক্সসেল কলামনাম (৫২) ফেরত বি @
শাজমূড়

1
"সহজতম" সমাধানটির বিপরীতে সবচেয়ে পরিষ্কারটি সেরা the
বেনামে টাইপ

9

কেবল পুনরাবৃত্তি ব্যবহার করে একটি সাধারণ দ্বি-লাইন সি # বাস্তবায়নে ফেলে দেওয়া হচ্ছে কারণ এখানে সমস্ত উত্তর প্রয়োজনের চেয়ে অনেক জটিল বলে মনে হচ্ছে।

/// <summary>
/// Gets the column letter(s) corresponding to the given column number.
/// </summary>
/// <param name="column">The one-based column index. Must be greater than zero.</param>
/// <returns>The desired column letter, or an empty string if the column number was invalid.</returns>
public static string GetColumnLetter(int column) {
    if (column < 1) return String.Empty;
    return GetColumnLetter((column - 1) / 26) + (char)('A' + (column - 1) % 26);
}

8

.. এবং পিএইচপি রূপান্তরিত:

function GetExcelColumnName($columnNumber) {
    $columnName = '';
    while ($columnNumber > 0) {
        $modulo = ($columnNumber - 1) % 26;
        $columnName = chr(65 + $modulo) . $columnName;
        $columnNumber = (int)(($columnNumber - $modulo) / 26);
    }
    return $columnName;
}

ord('A')65 এর পরিবর্তে ব্যবহার করুন
মুলি

8

আমি এখনও অবধি সমস্ত সমাধানগুলিতে পুনরাবৃত্তি বা পুনরাবৃত্তি রয়েছে surprised

এখানে আমার সমাধানটি ধ্রুবক সময়ে চলবে (কোনও লুপ নেই)। এই সমাধানটি সমস্ত সম্ভাব্য এক্সেল কলাম এবং চেকগুলির জন্য কাজ করে যে ইনপুটটিকে এক্সেল কলামে রূপান্তর করা যায়। সম্ভাব্য কলামগুলি [A, XFD] বা [1, 16384] এর মধ্যে রয়েছে। (এটি আপনার এক্সেলের সংস্করণের উপর নির্ভরশীল)

private static string Turn(uint col)
{
    if (col < 1 || col > 16384) //Excel columns are one-based (one = 'A')
        throw new ArgumentException("col must be >= 1 and <= 16384");

    if (col <= 26) //one character
        return ((char)(col + 'A' - 1)).ToString();

    else if (col <= 702) //two characters
    {
        char firstChar = (char)((int)((col - 1) / 26) + 'A' - 1);
        char secondChar = (char)(col % 26 + 'A' - 1);

        if (secondChar == '@') //Excel is one-based, but modulo operations are zero-based
            secondChar = 'Z'; //convert one-based to zero-based

        return string.Format("{0}{1}", firstChar, secondChar);
    }

    else //three characters
    {
        char firstChar = (char)((int)((col - 1) / 702) + 'A' - 1);
        char secondChar = (char)((col - 1) / 26 % 26 + 'A' - 1);
        char thirdChar = (char)(col % 26 + 'A' - 1);

        if (thirdChar == '@') //Excel is one-based, but modulo operations are zero-based
            thirdChar = 'Z'; //convert one-based to zero-based

        return string.Format("{0}{1}{2}", firstChar, secondChar, thirdChar);
    }
}

2
এফওয়াইআই: @ গ্রাহামের উত্তর (এবং সম্ভবত অন্যরা) আপনার চেয়ে বেশি সাধারণ: তারা কলামের নামগুলিতে 4+ অক্ষর সমর্থন করে। এবং এই কারণেই তারা পুনরাবৃত্তি হয়।
বার্নার্ড পলুস

প্রকৃতপক্ষে, যদি তারা সীমাহীন পূর্ণসংখ্যার এবং না ব্যবহার করে int, তবে ফলাফলযুক্ত কলামটির নামটি নির্বিচারে দীর্ঘ হতে পারে (উদাহরণস্বরূপ, অজগর উত্তরের ক্ষেত্রে এটি)
বার্নার্ড পাউলাস

1
যদি আমার ডেটা 16,384-কলামের স্প্রেডশিটের জন্য কখনও বড় হয় তবে আমি নিজেকে মাথায় গুলি করব shoot যাইহোক, এক্সেল এমনকি সম্ভাব্য তিন-অক্ষরের কলামগুলিও সমর্থন করে না (এটি এক্সএফডি থেকে 1,894 কলাম বাদ দেয়)। এখনই যাই হোক। ভবিষ্যতে আমার উত্তরটি প্রয়োজনীয় হিসাবে আপডেট করব।
ব্যবহারকারী 2023861

:) তা জানতেন না! আমার মন্তব্যটি বিভিন্ন অ্যালগরিদমের তাত্ত্বিক বৈশিষ্ট্যগুলিতে ছিল।
বার্নার্ড পলুস

এটি সম্ভবত সবচেয়ে সহজ এবং পরিষ্কার সমাধান।
হুয়ান

8

এই উত্তরটি জাভা স্ক্রিপ্টে রয়েছে:

function getCharFromNumber(columnNumber){
    var dividend = columnNumber;
    var columnName = "";
    var modulo;

    while (dividend > 0)
    {
        modulo = (dividend - 1) % 26;
        columnName = String.fromCharCode(65 + modulo).toString() + columnName;
        dividend = parseInt((dividend - modulo) / 26);
    } 
    return  columnName;
}

6

জাভাতে একই বাস্তবায়ন

public String getExcelColumnName (int columnNumber) 
    {     
        int dividend = columnNumber;   
        int i;
        String columnName = "";     
        int modulo;     
        while (dividend > 0)     
        {        
            modulo = (dividend - 1) % 26;         
            i = 65 + modulo;
            columnName = new Character((char)i).toString() + columnName;        
            dividend = (int)((dividend - modulo) / 26);    
        }       
        return columnName; 
    }  

5

এখানে সরবরাহিত সমস্ত সংস্করণগুলি দেখার পরে, আমি পুনরাবৃত্তি ব্যবহার করে নিজেই একটি করতে ইচ্ছে করেছিলাম।

এখানে আমার vb.net সংস্করণ:

Function CL(ByVal x As Integer) As String
    If x >= 1 And x <= 26 Then
        CL = Chr(x + 64)
    Else
        CL = CL((x - x Mod 26) / 26) & Chr((x Mod 26) + 1 + 64)
    End If
End Function

5

গেমটি থেকে একটু দেরি হলেও এখানে আমি ব্যবহার কোডটি (সি # তে):

private static readonly string _Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static int ColumnNameParse(string value)
{
    // assumes value.Length is [1,3]
    // assumes value is uppercase
    var digits = value.PadLeft(3).Select(x => _Alphabet.IndexOf(x));
    return digits.Aggregate(0, (current, index) => (current * 26) + (index + 1));
}

2
আপনি যা জিজ্ঞাসা করেছিলেন তার বিপরীতটি করেছিলেন, তবে আপনার ল্যাম্বদা-ফু এর জন্য +1 করেছেন।
নুরেটিন

IndexOfবেশ ধীর গতির, আপনি বিপরীত ম্যাপিংকে আরও ভালভাবে প্রাক্কলিত করতে চান।
ভ্লাদ

5

আমি কর্নেল সূচক এবং কর্নেল লেবেলের মধ্যে ইন্টারপপের জন্য আমি যে স্ট্যাটিক ক্লাসটি ব্যবহার করি তা নিক্ষেপ করতে চেয়েছিলাম। আমি আমার কলামল্যাবল পদ্ধতির জন্য পরিবর্তিত স্বীকৃত উত্তর ব্যবহার করি

public static class Extensions
{
    public static string ColumnLabel(this int col)
    {
        var dividend = col;
        var columnLabel = string.Empty;
        int modulo;

        while (dividend > 0)
        {
            modulo = (dividend - 1) % 26;
            columnLabel = Convert.ToChar(65 + modulo).ToString() + columnLabel;
            dividend = (int)((dividend - modulo) / 26);
        } 

        return columnLabel;
    }
    public static int ColumnIndex(this string colLabel)
    {
        // "AD" (1 * 26^1) + (4 * 26^0) ...
        var colIndex = 0;
        for(int ind = 0, pow = colLabel.Count()-1; ind < colLabel.Count(); ++ind, --pow)
        {
            var cVal = Convert.ToInt32(colLabel[ind]) - 64; //col A is index 1
            colIndex += cVal * ((int)Math.Pow(26, pow));
        }
        return colIndex;
    }
}

এটি ব্যবহার করুন ...

30.ColumnLabel(); // "AD"
"AD".ColumnIndex(); // 30

4

আপনি যদি কোড ছাড়া কোনও সেল সূত্রের জন্য এটি চান তবে এটির জন্য এখানে একটি সূত্র রয়েছে:

IF(COLUMN()>=26,CHAR(ROUND(COLUMN()/26,1)+64)&CHAR(MOD(COLUMN(),26)+64),CHAR(COLUMN()+64))

4

দেলফিতে (পাস্কাল):

function GetExcelColumnName(columnNumber: integer): string;
var
  dividend, modulo: integer;
begin
  Result := '';
  dividend := columnNumber;
  while dividend > 0 do begin
    modulo := (dividend - 1) mod 26;
    Result := Chr(65 + modulo) + Result;
    dividend := (dividend - modulo) div 26;
  end;
end;

3
private String getColumn(int c) {
    String s = "";
    do {
        s = (char)('A' + (c % 26)) + s;
        c /= 26;
    } while (c-- > 0);
    return s;
}

এটি হুবহু বেস 26 নয়, সিস্টেমে 0 নেই is যদি সেখানে থাকে তবে 'জেড' 'এএ' দ্বারা নয় 'বিএ' অনুসরণ করবে।


3

পার্ল ইন, 1 (এ), 27 (এএ) ইত্যাদির ইনপুট জন্য

sub excel_colname {
  my ($idx) = @_;       # one-based column number
  --$idx;               # zero-based column index
  my $name = "";
  while ($idx >= 0) {
    $name .= chr(ord("A") + ($idx % 26));
    $idx   = int($idx / 26) - 1;
  }
  return scalar reverse $name;
}

2

মূল সমাধানটি সংশোধন করা হচ্ছে (সি # তে):

public static class ExcelHelper
{
    private static Dictionary<UInt16, String> l_DictionaryOfColumns;

    public static ExcelHelper() {
        l_DictionaryOfColumns = new Dictionary<ushort, string>(256);
    }

    public static String GetExcelColumnName(UInt16 l_Column)
    {
        UInt16 l_ColumnCopy = l_Column;
        String l_Chars = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String l_rVal = "";
        UInt16 l_Char;


        if (l_DictionaryOfColumns.ContainsKey(l_Column) == true)
        {
            l_rVal = l_DictionaryOfColumns[l_Column];
        }
        else
        {
            while (l_ColumnCopy > 26)
            {
                l_Char = l_ColumnCopy % 26;
                if (l_Char == 0)
                    l_Char = 26;

                l_ColumnCopy = (l_ColumnCopy - l_Char) / 26;
                l_rVal = l_Chars[l_Char] + l_rVal;
            }
            if (l_ColumnCopy != 0)
                l_rVal = l_Chars[l_ColumnCopy] + l_rVal;

            l_DictionaryOfColumns.ContainsKey(l_Column) = l_rVal;
        }

        return l_rVal;
    }
}

2

এখানে অ্যাকশ্রিপ্ট সংস্করণ রয়েছে:

private var columnNumbers:Array = ['A', 'B', 'C', 'D', 'E', 'F' , 'G', 'H', 'I', 'J', 'K' ,'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];

    private function getExcelColumnName(columnNumber:int) : String{
        var dividend:int = columnNumber;
        var columnName:String = "";
        var modulo:int;

        while (dividend > 0)
        {
            modulo = (dividend - 1) % 26;
            columnName = columnNumbers[modulo] + columnName;
            dividend = int((dividend - modulo) / 26);
        } 

        return columnName;
    }

2

জাভাস্ক্রিপ্ট সমাধান

/**
 * Calculate the column letter abbreviation from a 1 based index
 * @param {Number} value
 * @returns {string}
 */
getColumnFromIndex = function (value) {
    var base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
    var remainder, result = "";
    do {
        remainder = value % 26;
        result = base[(remainder || 26) - 1] + result;
        value = Math.floor(value / 26);
    } while (value > 0);
    return result;
};

1
সূচক 26 এবং 27 ব্যবহার করে দেখুন It's এটি খুব কাছাকাছি তবে একের পর এক বন্ধ।
এরিক

মান = ম্যাথ.ফ্লুর (মান / 26); হওয়া উচিত মান = ম্যাথ.সিল (মান / 26) - 1;
হেনরি লিউ

2

এই নির্দিষ্ট কোড (সূচক 1 থেকে শুরু) এক্সেল কলামে রূপান্তর করতে আমার কোডগুলি

    public static string NumberToExcelColumn(uint number)
    {
        uint originalNumber = number;

        uint numChars = 1;
        while (Math.Pow(26, numChars) < number)
        {
            numChars++;

            if (Math.Pow(26, numChars) + 26 >= number)
            {
                break;
            }               
        }

        string toRet = "";
        uint lastValue = 0;

        do
        {
            number -= lastValue;

            double powerVal = Math.Pow(26, numChars - 1);
            byte thisCharIdx = (byte)Math.Truncate((columnNumber - 1) / powerVal);
            lastValue = (int)powerVal * thisCharIdx;

            if (numChars - 2 >= 0)
            {
                double powerVal_next = Math.Pow(26, numChars - 2);
                byte thisCharIdx_next = (byte)Math.Truncate((columnNumber - lastValue - 1) / powerVal_next);
                int lastValue_next = (int)Math.Pow(26, numChars - 2) * thisCharIdx_next;

                if (thisCharIdx_next == 0 && lastValue_next == 0 && powerVal_next == 26)
                {
                    thisCharIdx--;
                    lastValue = (int)powerVal * thisCharIdx;
                }
            }

            toRet += (char)((byte)'A' + thisCharIdx + ((numChars > 1) ? -1 : 0));

            numChars--;
        } while (numChars > 0);

        return toRet;
    }

আমার ইউনিট পরীক্ষা:

    [TestMethod]
    public void Test()
    {
        Assert.AreEqual("A", NumberToExcelColumn(1));
        Assert.AreEqual("Z", NumberToExcelColumn(26));
        Assert.AreEqual("AA", NumberToExcelColumn(27));
        Assert.AreEqual("AO", NumberToExcelColumn(41));
        Assert.AreEqual("AZ", NumberToExcelColumn(52));
        Assert.AreEqual("BA", NumberToExcelColumn(53));
        Assert.AreEqual("ZZ", NumberToExcelColumn(702));
        Assert.AreEqual("AAA", NumberToExcelColumn(703));
        Assert.AreEqual("ABC", NumberToExcelColumn(731));
        Assert.AreEqual("ACQ", NumberToExcelColumn(771));
        Assert.AreEqual("AYZ", NumberToExcelColumn(1352));
        Assert.AreEqual("AZA", NumberToExcelColumn(1353));
        Assert.AreEqual("AZB", NumberToExcelColumn(1354));
        Assert.AreEqual("BAA", NumberToExcelColumn(1379));
        Assert.AreEqual("CNU", NumberToExcelColumn(2413));
        Assert.AreEqual("GCM", NumberToExcelColumn(4823));
        Assert.AreEqual("MSR", NumberToExcelColumn(9300));
        Assert.AreEqual("OMB", NumberToExcelColumn(10480));
        Assert.AreEqual("ULV", NumberToExcelColumn(14530));
        Assert.AreEqual("XFD", NumberToExcelColumn(16384));
    }

আপনার পরীক্ষাগুলিতে (এক্সএফডি) সর্বাধিক সেল রেফারেন্স কী তা দেখানোর জন্য +1 - ওয়েবে এই তথ্যটি খুঁজে পাওয়া কতটা কঠিন তা আপনি বিশ্বাস করবেন না।
কন্ট্রোলবাক্স

2

যদিও আমি খেলায় দেরি করেছি, গ্রাহামের উত্তর অনুকূল হওয়া অনেক দূরে। বিশেষত, আপনার moduloকল, কল ToString()এবং প্রয়োগ প্রয়োগ করতে হবে না (int)। সি # বিশ্বে বেশিরভাগ ক্ষেত্রে আপনি 0 থেকে সংখ্যাটি শুরু করবেন তা বিবেচনা করে এখানে আমার সংশোধন:

public static string GetColumnName(int index) // zero-based
{
    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);

    return name;
}

2

আরেকটি ভিবিএ উপায়

Public Function GetColumnName(TargetCell As Range) As String
    GetColumnName = Split(CStr(TargetCell.Cells(1, 1).Address), "$")(1)
End Function

1

পিএইচপি-তে আমার সুপার লেট বাস্তবায়ন এখানে। এটি একটি পুনরাবৃত্তি। আমি এই পোস্টটি খুঁজে পাওয়ার ঠিক আগে এটি লিখেছিলাম। আমি দেখতে চাইছিলাম যে অন্যরা এই সমস্যাটি ইতিমধ্যে সমাধান করেছে কিনা ...

public function GetColumn($intNumber, $strCol = null) {

    if ($intNumber > 0) {
        $intRem = ($intNumber - 1) % 26;
        $strCol = $this->GetColumn(intval(($intNumber - $intRem) / 26), sprintf('%s%s', chr(65 + $intRem), $strCol));
    }

    return $strCol;
}

1

আমি জাভাতেও একই জিনিসটি করার চেষ্টা করছি ... আমি নিম্নলিখিত কোডগুলি লিখেছি:

private String getExcelColumnName(int columnNumber) {

    int dividend = columnNumber;
    String columnName = "";
    int modulo;

    while (dividend > 0)
    {
        modulo = (dividend - 1) % 26;

        char val = Character.valueOf((char)(65 + modulo));

        columnName += val;

        dividend = (int)((dividend - modulo) / 26);
    } 

    return columnName;
}

এখন একবার আমি এটি কলাম নাম্বার = ২৯ দিয়ে দৌড়ালে, এটি আমাকে ফলাফলটি = "সিএ" দেয় ("এসি" এর পরিবর্তে) আমি কী মিস করছি তার কোনও মন্তব্য দেয়? আমি জানি স্ট্রিংবিল্ডারের দ্বারা আমি এটিকে বিপরীত করতে পারি .... তবে গ্রাহামের জবাবের দিকে তাকিয়ে আমি কিছুটা বিভ্রান্ত ....


গ্রাহাম বলেছেন: columnName = Convert.ToChar(65 + modulo).ToString() + columnName(অর্থাত্ মান + কলনেম)। হাসান বলেছেন: columnName += val;(যেমন কলনাম + মান)
এমক্যালেক্স

আপনি নতুন চরিত্রটি প্রেন্ডিংয়ের পরিবর্তে সংযোজন করছেন। হওয়া উচিত columnName = columnName + val
ডোমেনিক ডি

1

মুদ্রা এবং মার্জিত রুবি সংস্করণ:

def col_name(col_idx)
    name = ""
    while col_idx>0
        mod     = (col_idx-1)%26
        name    = (65+mod).chr + name
        col_idx = ((col_idx-mod)/26).to_i
    end
    name
end

1

এই প্রশ্নটি অন্য সকলের পাশাপাশি গুগল পুনর্নির্দেশের তাই আমি এটি এখানে পোস্ট করছি।

এই উত্তরগুলির মধ্যে অনেকগুলি সঠিক তবে সাধারণ পরিস্থিতিতে যেমন আপনার যখন 26 টিরও বেশি কলাম নেই তখন খুব জটিল। আপনি ডাবল চরিত্রের কলামগুলিতে যেতে পারেন কিনা তা নিয়ে যদি সন্দেহ থাকে তবে এই উত্তরটিকে উপেক্ষা করুন, তবে আপনি যদি নিশ্চিত হন যে আপনি এটি না করেন, তবে আপনি সি # তে এটি এতটা সহজ করতে পারবেন:

public static char ColIndexToLetter(short index)
{
    if (index < 0 || index > 25) throw new ArgumentException("Index must be between 0 and 25.");
    return (char)('A' + index);
}

হেক, আপনি যা যা করছেন তার বিষয়ে যদি আপনি আত্মবিশ্বাসী হন তবে আপনি বৈধতাও সরিয়ে ফেলতে এবং এই ইনলাইনটি ব্যবহার করতে পারেন:

(char)('A' + index)

এটি অনেকগুলি ভাষায় অনুরূপ হবে যাতে আপনি এটি প্রয়োজন হিসাবে খাপ খাইয়ে নিতে পারেন।

আবার, কেবলমাত্র এটি ব্যবহার করুন আপনি যদি 100% নিশ্চিত হন যে আপনার কাছে 26 টিরও বেশি কলাম নেই


1

উত্তরের জন্য এখানে ধন্যবাদ !! আমি এলিক্সির / ফিনিক্সে কাজ করছি এমন Google পত্রক API এর সাথে কিছু কথোপকথনের জন্য এই সহায়ক সাহায্যকারী ফাংশনগুলি সামনে আসতে আমাকে সহায়তা করেছিল up

আমি এখানে যা এলাম তা এখানে (সম্ভবত কিছু অতিরিক্ত বৈধতা এবং ত্রুটি পরিচালনার ব্যবহার করতে পারে)

এলিক্সির:

def number_to_column(number) do
  cond do
    (number > 0 && number <= 26) ->
      to_string([(number + 64)])
    (number > 26) ->
      div_col = number_to_column(div(number - 1, 26))
      remainder = rem(number, 26)
      rem_col = cond do
        (remainder == 0) ->
          number_to_column(26)
        true ->
          number_to_column(remainder)
      end
      div_col <> rem_col
    true ->
      ""
  end
end

এবং বিপরীত কার্য:

def column_to_number(column) do
  column
    |> to_charlist
    |> Enum.reverse
    |> Enum.with_index
    |> Enum.reduce(0, fn({char, idx}, acc) ->
      ((char - 64) * :math.pow(26,idx)) + acc
    end)
    |> round
end

এবং কিছু পরীক্ষা:

describe "test excel functions" do
  @excelTestData [{"A", 1}, {"Z",26}, {"AA", 27}, {"AB", 28}, {"AZ", 52},{"BA", 53}, {"AAA", 703}]

  test "column to number" do
    Enum.each(@excelTestData, fn({input, expected_result}) ->
      actual_result = BulkOnboardingController.column_to_number(input)
      assert actual_result == expected_result
    end)
  end

  test "number to column" do
    Enum.each(@excelTestData, fn({expected_result, input}) ->
      actual_result = BulkOnboardingController.number_to_column(input)
      assert actual_result == expected_result
    end)
  end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.