কোনও সংখ্যার এক্সেল-জাতীয় কলামের নাম পেতে অ্যালগরিদম


97

আমি এমন স্ক্রিপ্টে কাজ করছি যা কিছু এক্সেল নথি উত্পন্ন করে এবং একটি সংখ্যাকে এর কলাম নামের সমতুল্যে রূপান্তর করা দরকার। উদাহরণ স্বরূপ:

1 => A
2 => B
27 => AA
28 => AB
14558 => UMX

আমি ইতিমধ্যে এটি করার জন্য একটি অ্যালগরিদম লিখেছি, তবে আমি এটি করতে সহজ বা দ্রুত উপায় কিনা তা জানতে চাই:

function numberToColumnName($number){
    $abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $abc_len = strlen($abc);

    $result_len = 1; // how much characters the column's name will have
    $pow = 0;
    while( ( $pow += pow($abc_len, $result_len) ) < $number ){
        $result_len++;
    }

    $result = "";
    $next = false;
    // add each character to the result...
    for($i = 1; $i<=$result_len; $i++){
        $index = ($number % $abc_len) - 1; // calculate the module

        // sometimes the index should be decreased by 1
        if( $next || $next = false ){
            $index--;
        }

        // this is the point that will be calculated in the next iteration
        $number = floor($number / strlen($abc));

        // if the index is negative, convert it to positive
        if( $next = ($index < 0) ) {
            $index = $abc_len + $index;
        }

        $result = $abc[$index].$result; // concatenate the letter
    }
    return $result;
}

আপনি এটি করার আরও ভাল উপায় জানেন? এটিকে সহজ রাখার জন্য কিছু আছে? না পারফরম্যান্সের উন্নতি?

সম্পাদনা করুন

ইরকমেক্সেলের বাস্তবায়ন বেশ সূক্ষ্মভাবে কাজ করে। তবে, আমি এই সুন্দর সংক্ষিপ্তটি যুক্ত করতে যাচ্ছি:

function num2alpha($n)
{
    for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
        $r = chr($n%26 + 0x41) . $r;
    return $r;
}

4
এই ম্যান পেজে প্রথম মন্তব্যটি সহায়ক হতে পারে: php.net/manual/en/function.base-convers.php#96304
সের্গেই ইরেনিন

কি দারুন! এটি একটি সংক্ষিপ্ত বাস্তবায়ন। ধন্যবাদ!
ক্রিশ্চিয়ান

আপনি কি পিএইচপি থেকে এক্সেল ডকুমেন্ট তৈরি করতে বিদ্যমান লাইব্রেরিগুলির কোনওটির দিকে নজর রেখেছেন?
মার্ক বাকের

হ্যা অবশ্যই. আমি আপনার দুর্দান্ত লাইব্রেরি ব্যবহার করছি, মার্ক। আমি কেবল অ্যালগরিদমগুলি লেখার ক্ষেত্রে আমার দক্ষতাগুলি উন্নত করতে চাই ... এটি সম্পর্কে কী সুন্দর তা হ'ল আপনি একটি কাজ শেষ করার পরে আপনি অন্যান্য অ্যালগরিদমগুলি খুঁজে পেতে পারেন যা ঠিক একই রকম হয় তবে সংক্ষিপ্ত হয়।
ক্রিশ্চিয়ান

4
আপনার সংক্ষিপ্ত অ্যালগরিদম আপনার অনুরোধে 1 -> A এর পরিবর্তে 0 -> এ ব্যবহার করে, অনুরোধের থেকে কিছুটা আলাদা ... যদি আপনি এটি চান তবে পিএইচপিইপ্সেল এর পিএইচপিএক্সেল_সেল :: স্ট্রিংফ্রোমকলম ইন্ডেক্স () পদ্ধতিটি দেখুন, যদিও আপনার নাম2alpha () বাস্তবায়ন হতে পারে দ্রুত হও ... আমি কয়েকটি পরীক্ষা চালিয়ে যাচ্ছি এবং এটি "ধার" নিতে (অনুমতি নিয়ে)
মার্ক বেকার

উত্তর:


158

এখানে একটি দুর্দান্ত সাধারণ পুনরাবৃত্তি ফাংশন (শূন্য সূচী সংখ্যাগুলির উপর ভিত্তি করে 0 == এ, 1 == বি, ইত্যাদি) ...

function getNameFromNumber($num) {
    $numeric = $num % 26;
    $letter = chr(65 + $numeric);
    $num2 = intval($num / 26);
    if ($num2 > 0) {
        return getNameFromNumber($num2 - 1) . $letter;
    } else {
        return $letter;
    }
}

এবং যদি আপনি এটির একটি সূচক চান (1 == এ, ইত্যাদি):

function getNameFromNumber($num) {
    $numeric = ($num - 1) % 26;
    $letter = chr(65 + $numeric);
    $num2 = intval(($num - 1) / 26);
    if ($num2 > 0) {
        return getNameFromNumber($num2) . $letter;
    } else {
        return $letter;
    }
}

0 থেকে 10000 পর্যন্ত সংখ্যার সাথে পরীক্ষিত ...


ধন্যবাদ! আমাকে এক ঘন্টা বাঁচাল!
ড্যারিল হেইন

আমি এই পিএইচপি স্ক্রিপ্টটি জেএসে
টেরক্স

আমি সন্দেহ করি recusive ফাংশনটি ভাল হয় বা না যদি লুপে ব্যবহৃত হয়? এটি স্ট্যাক স্পেস সমস্যা তৈরি করতে পারে?
স্কট চু

96

পিএইচপিস্প্রেডশিট ব্যবহার করা ( পিপিইপিএক্সেলকে অবমূল্যায়ন করা হয়েছে )

// result = 'A'
\PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex(1);

নোট সূচক 0 জেডে ফলাফল

https://phpsPresssheet.readthedocs.io/en/develop/


সঠিক উত্তর (আপনি যদি পিএইচপিইপেক্সেল লাইব্রেরি ব্যবহার করেন ) হ'ল:

// result = 'A'
$columnLetter = PHPExcel_Cell::stringFromColumnIndex(0); // ZERO-based! 

এবং পিছনে:

// result = 1
$colIndex = PHPExcel_Cell::columnIndexFromString('A');

12
stringFromColumnIndex (1) আয় 'বি'
ভবিষ্য

4
দুর্দান্ত! আমি পিএইপপিএক্সসেল ব্যবহার করতে পারি। এটি ঝরঝরে উত্তর।
স্কট চু

PHPExcel_Cell::stringFromColumnIndex(1)প্রকৃতপক্ষে ফিরে আসে 'B', আপনার উত্তর সম্পাদনা করুন।
মার্থিম

13

1 -> এ, 2 -> বি, ইত্যাদির জন্য সূচকযুক্ত

function numToExcelAlpha($n) {
    $r = 'A';
    while ($n-- > 1) {
        $r++;
    }
    return $r;
}

0 -> এ, 1 -> বি, ইত্যাদির জন্য সূচকযুক্ত

function numToExcelAlpha($n) {
    $r = 'A';
    while ($n-- >= 1) {
        $r++;
    }
    return $r;
}

সিএর নয় বরং চরিত্রের ভেরিয়েবলগুলিতে গাণিতিক ক্রিয়াকলাপগুলি পরিচালনা করার সময় পিএইচপি পার্লের সম্মেলন অনুসরণ করে of নোট করুন যে অক্ষর ভেরিয়েবলগুলি বাড়ানো যেতে পারে তবে হ্রাস করা যায় না।


এটি একটি ভাল সমাধান কিন্তু আমি এটা 1234567789. মত বড় সংখ্যার উপর সার্ভার টাইম আউট হবে মনে
তাহির রাজা

5

এটি রূপান্তর করতে হবে (পূর্ণসংখ্যার গণিত অনুমান করে), তবে আমি অন্যান্য পোস্টারের সাথে একমত; শুধু ব্যবহারbase_convert

function numberToColumnName($number)
{
    $abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $len = strlen($abc);

    $result = "";
    while ($number > 0) {
       $index  = $number % $len;
       $result = $abc[$index] . $result;
       $number = floor($number / $len);
    }

    return $result;
}

এই ফিরে আসবে Bজন্য $number = 1পরিবর্তে Aযেহেতু 1 % 26হল1
জালাল

5

দেরীতে উত্তর, তবে আমি এখানে যা করেছি (1 == একটি সূচিবদ্ধের জন্য):

function num_to_letters($num, $uppercase = true) {
    $letters = '';
    while ($num > 0) {
        $code = ($num % 26 == 0) ? 26 : $num % 26;
        $letters .= chr($code + 64);
        $num = ($num - $code) / 26;
    }
    return ($uppercase) ? strtoupper(strrev($letters)) : strrev($letters);
}

তারপরে আপনি যদি অন্যভাবে রূপান্তর করতে চান:

function letters_to_num($letters) {
    $num = 0;
    $arr = array_reverse(str_split($letters));

    for ($i = 0; $i < count($arr); $i++) {
        $num += (ord(strtolower($arr[$i])) - 96) * (pow(26,$i));
    }
    return $num;
}

3

সংখ্যাটি এক্সেল কলাম বর্ণগুলিতে রূপান্তর করে:

/**
 * Number convert to Excel column letters
 * 
 * 1 = A
 * 2 = B
 * 3 = C
 * 27 = AA
 * 1234567789 = CYWOQRM
 * 
 * @link https://vector.cool/php-number-convert-to-excel-column-letters-2
 * 
 * @param int  $num       欄數
 * @param bool $uppercase 大小寫
 * @return void
 */
function num_to_letters($n)
{
    $n -= 1;
    for ($r = ""; $n >= 0; $n = intval($n / 26) - 1)
        $r = chr($n % 26 + 0x41) . $r;
    return $r;
}

প্রাক্তন:

echo num_to_letters(1);          // A
echo num_to_letters(2);          // B
echo num_to_letters(3);          // C
echo num_to_letters(27);         // AA
echo num_to_letters(1234567789); // CYWOQRM

এক্সেল কলামের বর্ণগুলি সংখ্যায় রূপান্তর করে:

/**
 * Excel column letters convert to Number
 *
 * A = 1
 * B = 2
 * C = 3
 * AA = 27
 * CYWOQRM = 1234567789
 * 
 * @link https://vector.cool/php-number-convert-to-excel-column-letters-2
 * 
 * @param string $letters
 * @return mixed
 */
function letters_to_num($a)
{
    $l = strlen($a);
    $n = 0;
    for ($i = 0; $i < $l; $i++)
        $n = $n * 26 + ord($a[$i]) - 0x40;
    return $n;
}

প্রাক্তন:

echo letters_to_num('A');       // 1
echo letters_to_num('B');       // 2
echo letters_to_num('C');       // 3
echo letters_to_num('AA');      // 27
echo letters_to_num('CYWOQRM'); // 1234567789

2
<?php
function numberToColumnName($number){
    $abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $abc_len = strlen($abc);

    $result = "";
    $tmp = $number;

    while($number > $abc_len) {
        $remainder = $number % $abc_len;
        $result = $abc[$remainder-1].$result;
        $number = floor($number / $abc_len);
    }
    return $abc[$number-1].$result;
}

echo numberToColumnName(1)."\n";
echo numberToColumnName(25)."\n";
echo numberToColumnName(26)."\n";
echo numberToColumnName(27)."\n";
echo numberToColumnName(28)."\n";
echo numberToColumnName(14558)."\n";
?>

ভাল চেষ্টা! যদিও এটি ব্যর্থ হবে ... 2049 দিয়ে চেষ্টা করে দেখুন আপনি দেখতে পাবেন: ডি
ক্রিশ্চিয়ান

2

রাইম্যাক্সেলের পুনরাবৃত্ত উত্তরগুলির সংমিশ্রণটি আমি এটি পেয়েছি:

    ফাংশন getNameFromNumber ($ সংখ্যা, $ সূচক = 0)
        $ সূচক = অ্যাবস ($ সূচক * 1); // নিশ্চিত করুন যে সূচকটি ইতিবাচক পূর্ণসংখ্যা
        u সংখ্যাসূচক = ($ সংখ্যা - $ সূচক)% 26; 
        $ চিঠি = চিআর (65 + $ সংখ্যাসূচক);
        $ num2 = অবধি (($ সংখ্যা - $ সূচক) / 26);
        যদি ($ num2> 0)
            getNameFromNumber ($ num2 - 1 + $ সূচক) প্রদান করুন। $ চিঠি;
        } অন্য {
            ফিরতি $ চিঠি;
        }
    }

আমি ডিফল্ট সূচকটি 0 ভিত্তিক হিসাবে ব্যবহার করছি তবে পিএইচপি-তে অ্যারে নিয়ে চলাফেরা করার সময় এটি কোনও ইতিবাচক পূর্ণসংখ্যার হতে পারে।


2

আমি প্রযোজনায় এটি কখনই ব্যবহার করব না কারণ এটি পাঠযোগ্য নয়, তবে মজাদার জন্য ... কেবল জেডজেড পর্যন্ত।

<?php
    $col = 55;
    print (($n = (int)(($col - 1) / 26)) ? chr($n + 64) : '') . chr((($col - 1) % 26) + 65);
?>

0

এটির একটি জাভাস্ক্রিপ্ট বাস্তবায়ন সন্ধানকারী যে কোনও ব্যক্তির কাছে , জাভাস্ক্রিপ্টে @ ইরকম্যাক্সেলের উত্তর দেওয়া আছে ..

function getNameFromNumber(num){
    let numeric = num%26;
    let letter = String.fromCharCode(65+numeric);
    let num2 = parseInt(num/26);
    if(num2 > 0) {
      return getNameFromNumber(num2 - 1)+letter;
    } else {
      return letter;
    }
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.