Autor Zpráva
Prefin
Profil
Ahojda.
Potřeboval jsem si udělat script na export dat z MySql do Excelu na bázi knihovny PHPExcel.
Nějakou záhadou se mi to snad i povedlo a script dělá to co má.
Zdroj se includuje do stránky a jediný parametr, který potřebuje je název tabulky, kterou má vycucnout. Tabulka může mít prakticky jakoukoli strukturu, jediné omezení je v počtu sloupců ale to by se dalo snadno zvýšit.
Nějak se mi zdá ale zbytečně komplikovanej tak jsem se chtěl zeptat, jestli by někoho nenapadlo, jak ho zjednodušit.
Taky by bylo dobrý aby uměl nastavit šířku sloupce podle velikosti rezervované v databázi (varchar(50)=šířka 50 znaků) ale to mě zatím netrklo jak.
Volá se:
if($_POST["export_xls"]) {
    include "export_xls.php";
}
export_xls.php:
<?php
// Funkce na pojmenování sloupců do tabulky EXCEL. !!! POZOR - maximální možný počet sloupců je 52.
$znaky = 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");
$sql = "SELECT * FROM ".$_POST["tabulka_xls"]." LIMIT 1"; // Zjištění počtu sloupců
$x = 0;
$pocet = mysql_fetch_row(mysql_query($sql));
for($i=0;$i<=count($pocet);) {
    if($i==26) $x = 0;
    if($i>25) $sloupec[$i] = "A";
    $sloupec[$i] .= $znaky[$x];
    $x++;
    $i++;
}

// Nastavení cesty ke třídám PHPExcel
ini_set('include_path', ini_get('include_path').';./Classes/');

// Vložení potřebných tříd pro práci a tvorbu souboru 
include 'PHPExcel.php';
include 'PHPExcel/Writer/Excel2007.php';

// Vytvoření PHPExcel objektu
$objPHPExcel = new PHPExcel();
// Nastavení metadat - autor, název, popis, ...
$objPHPExcel->getProperties()->setCreator("xxxxxxxxxxxx");
$objPHPExcel->getProperties()->setLastModifiedBy("xxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setTitle($_POST["tabulka_xls"]);
$objPHPExcel->getProperties()->setSubject("xxxxxxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setDescription("xxxxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setKeywords("xxxxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setCategory("xxxxxxxxxxxxxxxxxx");
$objPHPExcel->setActiveSheetIndex(0);

// Vložení hodnot 
// Načtení seznamu spoupců
$vysl = mysql_query('SHOW COLUMNS FROM  '.$_POST["tabulka_xls"]);
$x = 0;
while($v=mysql_fetch_assoc($vysl)) {
    $objPHPExcel->getActiveSheet()->SetCellValue($sloupec[$x]."1", $v['Field']);
    // Nějak nastavit šířku sloupce
    // nastavení fontů
    $objPHPExcel->getActiveSheet()->getStyle($sloupec[$x]."1")->getFont()->setBold(true);
    $x++;
}
// Generování dat u tabulky
$sql = "SELECT * FROM ".$_POST["tabulka_xls"];
$vysl = mysql_query($sql);
$x = 0;
while($v=mysql_fetch_row($vysl)) {
    for($y=0;$y<($i-1);$y++) {
        $objPHPExcel->getActiveSheet()->SetCellValue($sloupec[$y].($x+2), $v[$y]);
    }
    $x++;
}

// Nastavení jména listu 
$objPHPExcel->getActiveSheet()->setTitle('Tabulka '.$_POST["tabulka_xls"]." - ".Date("j-m-Y",time()));

// Uložení souboru Excel 2007 
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save("xls/tabulka-".$_POST["tabulka_xls"]."-".Date("j-m-Y",time()).".xlsx");

//echo "Soubor vytvořen.";

?>
Jo a nekamenujte mě za předpotopní techniku, nejsem programátor. Jenom mě to celkem baví.
Díkas
Joker
Profil
Prefin:
Pár tipů:
• Export databázové tabulky do formátu čitelného v Excelu zvládne leckterý nástroj pro správu databáze, třeba phpMyAdmin.
• Udělal bych to jako funkci, aby to ostatní skripty mohly volat jak se jim hodí.
• Název tabulky by byl parametr funkce, takhle to musí spoléhat na nějak pojmenované vstupní políčko.
"SELECT * FROM ".$_POST["tabulka_xls"] je ošklivé, SQL injection.
• Je potřeba nejdřív načíst první řádek, z něj určit sloupce a potom načíst veškerá data (včetně prvního řádku)? Nestačilo by jen načíst celou tabulku, podle prvního řádku určit hlavičky a rovnou zapsat data?
Prefin
Profil
• Export MyAdmin zvládne to jo, ale když to chci mít někde v administraci webu pořád při ruce tak je to šikovnější jako vlastní.
• Jako Funkce to skončí i když v tuhle chvíli to mám na jediném místě takže mě to až tak nepálí.
"SELECT * FROM ".mysql_real_escape_string($_POST["tabulka_xls"]) bude taky myslím lepší.
• Udělat vše na jeden dotaz by asi šlo, nicméně si se složitějšími dotazy zatím neporadím. Kromě toho zatím nevím, jakým způsobem se zjištují parametry sloupců z tabulky.
Poradil byste mi?
Dík za tipy.
Prefin
Profil
Tak se mi to nakonec na jeden dotaz povedlo:
// Funkce na pojmenování sloupců do tabulky EXCEL. !!! POZOR - maximální možný počet sloupců je 52.
$znaky = 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");
$sql = "SELECT * FROM ".mysql_real_escape_string($_POST["tabulka_xls"]);
$vysl = mysql_query($sql);
$x = 0;
$pocet = mysql_fetch_row($vysl); // 26
for($i=0;$i<=count($pocet);) {
    if($i==26) $x = 0;
    if($i>25) $sloupec[$i] = "A";
    $sloupec[$i] .= $znaky[$x];
    $x++;
    $i++;
}

// Nastavení cesty ke třídám PHPExcel
ini_set('include_path', ini_get('include_path').';./Classes/');

// Vložení potřebných tříd pro práci a tvorbu souboru 
include 'PHPExcel.php';
include 'PHPExcel/Writer/Excel2007.php';

// Vytvoření PHPExcel objektu
$objPHPExcel = new PHPExcel();
// Nastavení metadat - autor, název, popis, ...
$objPHPExcel->getProperties()->setCreator("xxxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setLastModifiedBy("xxxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setTitle($_POST["tabulka_xls"]);
$objPHPExcel->getProperties()->setSubject("xxxxxxxxxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setDescription("xxxxxxxxxxxxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setKeywords("xxxxxxxxxxxxxxxxxxxxxx");
$objPHPExcel->getProperties()->setCategory("xxxxxxxxxxxxxxxxxxx");
$objPHPExcel->setActiveSheetIndex(0);

// Načtení seznamu spoupců a formátování prvního řádku
for($b=0; $b < mysql_num_fields($vysl); $b++) {
    $objPHPExcel->getActiveSheet()->SetCellValue($sloupec[$b].'1', mysql_field_name($vysl,$b));
    $objPHPExcel->getActiveSheet()->getColumnDimension($sloupec[$b])->setWidth(mysql_field_len($vysl,$b));
    $objPHPExcel->getActiveSheet()->getStyle($sloupec[$b]."1")->getFont()->setBold(true);
}

// Vložení dat
$x = 0;
while($v=mysql_fetch_row($vysl)) {
    for($y=0;$y<($i-1);$y++) {
        $objPHPExcel->getActiveSheet()->SetCellValue($sloupec[$y].($x+2), $v[$y]);
    }
    $x++;
}

// Nastavení jména listu 
$objPHPExcel->getActiveSheet()->setTitle($_POST["tabulka_xls"]);

// Uložení souboru Excel 2007 
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save("xls/tabulka-".$_POST["tabulka_xls"]."-".Date("j-m-Y",time()).".xlsx");
Ještě mi to házelo chybu moc dlouhého názvu listu (ř. 51) ale to už je taky OK.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: