Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/blue-team.org/bcblog/textpattern/lib/txplib_db.php on line 14 Bc. BLOG: PHP funkce převádějící čísla na excelovské názvy sloupců

Středa únor 25, 2009

PHP funkce převádějící čísla na excelovské názvy sloupců

· rubrika Clanky · kategorie

Nedávno jsem programoval export dat z databáze do formátu xlsx (MS Excel), kde jsem využil projektu "PHPExcel":http://www.codeplex.com/PHPExcel/. Jak asi víte, při základním nastavení jsou v Excelu jednotlivé sloupce označeny písmeny např. AC. Využívá se písmen A-Z, kde A odpovída číslu 1, B číslu 2 atd. Při exportu dat jsem tak potřeboval dle počtu sloupců v tabulce vytvořit příslušný počet "excelovských názvů" sloupců.
Po chvilce zamyšlení mne napadlo převést si tento problém do matematiky, kde by se v základu dalo využít způsobu převodu dekadického čísla do jakékoliv jiné číselné soustavy. Stačí si představit písmena A-Z jako čísla 0-25 a k číslu následně přičíst 65 aby jsme dostali odpovídající číselnou hodnotu znaku v ascii tabulce. Toto ovšem nemůžeme použít, nedostali by jsme to co přesně chceme. Po sloupci s označením Z následuje AA, po AZ následuje BA atd., ale pouhým převodem do jiné soustavy dostaneme něco podobného:
Array ( [0] => 90 ) Z
Array ( [0] => 66 [1] => 66 ) BB
Z tohoto důvodu je třeba funkci pro převod upravit. Výslednou funkci i s testovacím výpisem naleznete zde:

Zdrojový kód:

  1. <?php
  2. /* funkce prevadejici cisla 1...n na nazvy sloupcu v excelu A,B,C,...AA,AB,AC,....AAA,AAB,AAC,.... */
  3.  
  4. function getExcelColumnsNames($column) {
  5.   //cisla mensi 26 muzeme rovnou vratit
  6.   if ($column>=26){
  7.     //delime dekadicke cislo 26 dokud neziskame vsechny zbytky po deleni
  8.     while (ceil($column/26)!= 0){
  9.        if (($column % 26)+64 != 64){ //
  10.           $num[] = ($column % 26)+64;        
  11.           $column = floor($column/26);
  12.        }else{
  13.           unset($num);
  14.           break;
  15.        }
  16.     }
  17.   }else{
  18.     $num[] = $column+65;
  19.   }
  20.   return $num;
  21. }
  22.  
  23. // TEST funkce
  24. // vypis 720 sloupcu
  25. for ($j=0; $j<=720;$j++ ) {
  26.   $array = getExcelColumnsNames($j);
  27.   for ($k=count($array); $k>=0;$k--) {
  28.     echo chr($array[$k]);
  29.   }
  30. }
  31. ?>

16:09 — Zobrazeno: 448x — Stálý odkaz



Komentáře

  1. Tomas napsal dne 09/21/09 v 12:05 · #

    Ahoj
    O podobnou fci se nyni take pokousim v C#. Nasel jsem tvuj prikladek a tak jej testuji. Vsechno fachci docela dobre, az na nektere anomalie.
    Napr zadam column:
    697=‚ZU‘ a z fce=‚U‘;
    701=‚ZY‘ a fce=‚Y‘;
    4758= ‚FZZ‘ a fce=''
    Proste to ‚Z‘ nejak hapruje.
    Mrkni prosim te na to a dej vedet.

    Dik
    Tomas

  2. Howkey napsal dne 09/21/09 v 12:28 · #

    Ahoj, vim o tom, ale diky za info Nejak jsem na to uplne zapomel a neopravil to… Musim se na to kouknout a pak to editnu.

Přidání komentáře
Formát Texy

Váš příspěvek by měl být psán srozumitelně a k danému tématu! Nepoužívejte hrubé nadávky, vulgarismy, atd. a před samotným odesláním příspěvku si ho prosím ještě zkontrolujte!

Tučně zvýrazněné položky je nutno vyplnit!

Další komentáře:

XHTML 1.0 Strict - CSS