2010-11-27 27 views
0

J'ai un script PHP pour l'exportation de la table MYSQL au format Excel, mais j'ai un problème après l'exportation de la table. Les données qui proviennent de db ne montrent qu'une seule ligne.Exportation d'une table MYSQL en Excel

Ce script suivant:

$dbc=mysql_connect(_SRV,_ACCID,_PWD) or die(_ERROR15.": ".mysql_error()); 
$db=mysql_select_db("qdbase",$dbc) or die(_ERROR17.": ".mysql_error()); 

$sQuery = "SELECT id, Line, Model,Lot_no, 
        COUNT(Serial_number) AS Qty, 
        SUM(S), SUM(A), SUM(B), SUM(C), 
        (SUM(S) + SUM(A) + SUM(B)*0.4 + SUM(C)*0.1)/COUNT(Serial_number) AS QP, 
        ROUND((SUM(S) + SUM(A) + SUM(B)*0.4 + SUM(C)*0.1)/COUNT(Serial_number)*1000,2) AS PPM 
      FROM `inspection_report`"; 

$rResult = mysql_query($sQuery) or die(); 
$count = mysql_num_fields($rResult); 

// fetch table header 
$header = ''; 
for ($i = 0; $i < $count; $i++){ 
     $header .= mysql_field_name($rResult, $i)."\t"; 
     } 
// fetch data each row, store on tabular row data 
while($row = mysql_fetch_row($rResult)){ 
     $line = ''; 
     foreach($row as $value){ 
       if(!isset($value) || $value == ""){ 
        $value = "\t"; 
       }else{ 
        $value = str_replace('"', '""', $value); 
        $value = '"' . $value . '"' . "\t"; 
        } 
       $line .= $value; 
       } 
     $data .= trim($line)."\n"; 
     $data = str_replace("\r", "", $data); 

if ($data == "") { 
     $data = "\nno matching records found\n"; 
     } 

header("Content-type: application/vnd.ms-excel; name='excel'"); 
header("Content-Disposition: attachment; filename=exportfile.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

// output data 
echo $header."\n".$data; 
?> 

A côté de cela, comment faire une frontière pour cette table?

Répondre

5

si je veux faire: echo ""; lequel l'endroit correct à l'a mis que ne peux pas faire mon manuscrit devenir l'erreur ?

Si vous êtes goign de le faire comme une table html alors je qu'exclusivement sortie liek vous normalement droit une table ... par exemple, vous pourriez faire:

$rResult = mysql_query($sQuery) or die(); 
$count = mysql_num_fields($rResult); 

$html = '<table border="1"><thead><tr>%s</tr><thead><tbody>%s</tbody></table>'; 
$thead = ''; 
$tbody = ''; 
$line = '<tr>%s</tr>'; 
for ($i = 0; $i < $count; $i++){  
    $thead .= sprintf('<th>%s</th>',mysql_field_name($rResult, $i)); 
} 


while(false !== ($row = mysql_fetch_row($rResult))){ 
    $trow = ''; 

    foreach($row as $value){ 
    $trow .= sprintf('<td>%s</td>', $value); 
    } 

    $tbody .= sprintf($line, $trow); 

} 


header("Content-type: application/vnd.ms-excel; name='excel'"); 
header("Content-Disposition: attachment; filename=exportfile.xls"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

print sprintf($html, $thead, $tbody); 
exit; 

seulement obtenir un Youre row parce que vous utilisez des fonctions d'agrégat sans clause GROUP BY. Essayez d'ajouter un GROUP BY sur quelque chose qui lie chacune de ces "entrées" à un groupe spécifique comme le Lot_no ou tout ce que vous essayez de signaler.

En ce qui concerne la frontière, vous ne pouvez pas faire avec CSV qui, bien que readbale par Excel, n'est pas réellement un fichier de format Excel avec tous les extras comme le formatage des frontières. Pour utiliser des fonctionnalités telles que le formatage, vous devez générer un fichier Excel natif ou une table html pouvant être chargée dans Excel. Jetez un oeil à phpexcel si vous avez besoin de le faire.

+0

si je veux faire: echo "

"; quel est le bon endroit pour le mettre qui ne peut pas faire de mon script une erreur? – klox

+0

yah ... je veux faire comme ça. – klox

+0

+1 pour identifier le problème, et pour référencer PHPExcel pour générer de vrais fichiers Excel plutôt que des fichiers de valeurs séparés par des tabulations se faisant passer pour xls –

1

Vous ne tirez réellement rien d'autre des tables. Vous avez seulement une requête et il tire les informations d'en-tête. Exécutez une instruction sql comme "select * from tableName" pour obtenir le reste, puis faites le while et la boucle avec cette requête. PHP/navigateurs ne fonctionnent normalement pas bien avec des éléments en dehors des langages de programmation, XML et CSV. Je regarderais plus vers l'un de ces deux. XML est lisible par les nouvelles versions d'Excel (et peut être ouvert dans Internet Explorer sous forme XML), alors que csv est plus largement utilisé pour partager entre différents types de bases de données/tableurs. Pour un exemple de sortie XML goto http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html et pour la sortie CSV, vous devrez utiliser la fonction fputcsv() sur un tableau. Pour l'exemple:

$query = mysql_fetch_row($rResult);//the query of the table 
      // use 'select * from table' to list everything 
$xls = fopen('file.csv', 'a'); //opens document for writing and attempts to create if file does not exist 
foreach ($list as $fields) { 
     fputcsv($fp, $fields); 
} 
fclose($xls); //always close the file when done 

Les deux sont des manières sales d'exporter mais travaillent.

+1

+1 pour phpexcel, c'est une bibliothèque assez solide pour traiter des documents Excel en PHP. –

+0

c'est une bonne idée. Mais je veux seulement jouer avec le script :) – klox

1

essayer ce code, il fonctionne pour moi:

<?php 
$db_name  = "db_name"; 
$db_password = "pass"; 
$db_link  = mysql_connect("localhost", "root", $db_password); 
mysql_select_db($db_name, $db_link); 
mysql_query("SET NAMES UTF8"); 
$table = "table_name"; 
function assoc_query_2D($sql, $id_name = false){ 
    $result = mysql_query($sql); 
    $arr = array(); 
    $row = array(); 
    if($result){ 
    if($id_name == false){ 
     while($row = mysql_fetch_assoc($result)) 
     $arr[] = $row; 
    }else{ 
     while($row = mysql_fetch_assoc($result)){ 
     $id = $row['id']; 
     $arr[$id] = $row; 
     } 
    } 
    }else return 0; 

    return $arr; 
} 

function query_whole_table($table, $value = '*'){ 
    $sql = "SELECT $value FROM $table"; 
    return assoc_query_2D($sql); 
} 

$export_str = ""; 
$result = query_whole_table($table); 

foreach($result as $record){ 
    $export_str .= implode(";",$record) . "\n"; 
} 
// add time to fileName 
$date = time(); 
file_put_contents($date.'_'.$table."_export.csv", $export_str); 
?>