2010-03-22 8 views
2

Comment puis-je créer un document .XLS à partir d'une table mySQL en utilisant PHP?mySQL à XLS en utilisant PHP?

J'ai essayé à peu près tout, sans succès. Fondamentalement, j'ai besoin de prendre des données de forme, et l'entrée dans une base de données, ce que j'ai fait, puis j'ai besoin de récupérer ces données de table et l'analyser dans un fichier Microsoft Excel, qui doit être automatiquement sauvegardé sur le serveur web.

<?php 

// DB TABLE Exporter 
// 
// How to use: 
// 
// Place this file in a safe place, edit the info just below here 
// browse to the file, enjoy! 

// CHANGE THIS STUFF FOR WHAT YOU NEED TO DO 

    $dbhost = "-"; 
    $dbuser = "-"; 
    $dbpass = "-"; 
    $dbname = "-"; 
    $dbtable = "-"; 

// END CHANGING STUFF 

$cdate = date("Y-m-d"); // get current date 


// first thing that we are going to do is make some functions for writing out 
// and excel file. These functions do some hex writing and to be honest I got 
// them from some where else but hey it works so I am not going to question it 
// just reuse 


// This one makes the beginning of the xls file 
function xlsBOF() { 
    echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); 
    return; 
} 

// This one makes the end of the xls file 
function xlsEOF() { 
    echo pack("ss", 0x0A, 0x00); 
    return; 
} 

// this will write text in the cell you specify 
function xlsWriteLabel($Row, $Col, $Value) { 
    $L = strlen($Value); 
    echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); 
    echo $Value; 
    return; 
} 



// make the connection an DB query 
$dbc = mysql_connect($dbhost , $dbuser , $dbpass) or die(mysql_error()); 
mysql_select_db($dbname); 
$q = "SELECT * FROM ".$dbtable." WHERE date ='$cdate'"; 
$qr = mysql_query($q) or die(mysql_error()); 

// start the file 
xlsBOF(); 

// these will be used for keeping things in order. 
$col = 0; 
$row = 0; 

// This tells us that we are on the first row 
$first = true; 

while($qrow = mysql_fetch_assoc($qr)) 
{ 
    // Ok we are on the first row 
    // lets make some headers of sorts 
    if($first) 
    { 
     foreach($qrow as $k => $v) 
     { 
      // take the key and make label 
      // make it uppper case and replace _ with ' ' 
      xlsWriteLabel($row, $col, strtoupper(ereg_replace("_" , " " , $k))); 
      $col++; 
     } 

     // prepare for the first real data row 
     $col = 0; 
     $row++; 
     $first = false; 
    } 

    // go through the data 
    foreach($qrow as $k => $v) 
    { 
     // write it out 
     xlsWriteLabel($row, $col, $v); 
     $col++; 
    } 
    // reset col and goto next row 
    $col = 0; 
    $row++; 
} 

xlsEOF(); 
exit(); 
?> 

Je ne peux pas sembler comprendre comment intégrer fwrite dans tout ce que pour écrire les données générées dans un fichier .xls, comment pourrais-je le faire de cela?

J'ai besoin d'obtenir ce travail de toute urgence, donc toute aide serait grandement appréciée. Merci les gars.

Répondre

1

Si vous avez une sorte de frontal pour votre base de données (comme phpMyAdmin ou SQLyog), vous pouvez exporter la table (ou le résultat de n'importe quelle requête SELECT) vers CSV et l'ouvrir dans Excel. Éditer après les commentaires: Il était un peu différent, mais ce que je l'ai été mis ceci au début de mon PHP (avant toute sortie a été générée):

header("Content-type: application/vnd.ms-excel"); 
header("Content-disposition: attachment; filename=\"name.xls\""); 

Et dans le reste du script que je viens en écho une table (table, tr, td ... etc) L'exécution de ce script donnerait un téléchargement à l'utilisateur. Je pense qu'il existe différentes options pour l'attribut Content-disposition (peut-être qu'il y en a un qui permet au script de sauvegarder le fichier).

+0

Il doit être automatisé, le script sera exécuté par tâche cron chaque jour à un moment précis, j'ai juste besoin de savoir comment obtenir le script pour enregistrer les données xls générées à un fichier automatiquement. – Odyss3us

+0

Ok .. Dans ce cas, ma solution n'est pas si bonne .. Laissez-moi l'éditer .. –

+0

Dans cron, vous pouvez également exécuter wget pour enregistrer la sortie du script php quelque part. – Krab

0

Si je comprends bien, le script que vous avez posté fonctionne correctement et crée un fichier xls correct, et vous voulez juste enregistrer la sortie, regardez http://php.net/manual/en/book.outcontrol.php. Avec ob_get_clean(), vous pouvez obtenir le fichier xls créé et l'écrire quelque part sur le serveur. Peut-être, vous pourriez envisager également d'autres options, telles que l'enregistrement de vos données dans un autre format Excel peut lire (.csv, probablement il peut aussi lire une table html/xml).

+0

Je l'ai essayé avec ob_get_clean(), mais cela n'a pas fonctionné, voici le code sur lequel j'ai travaillé: – Odyss3us

0

Je l'ai essayé avec ob_get_clean(), mais il ne fonctionne pas, voici le code que je travaille maintenant:

<?php 

// DB TABLE Exporter 
// 
// How to use: 
// 
// Place this file in a safe place, edit the info just below here 
// browse to the file, enjoy! 

// CHANGE THIS STUFF FOR WHAT YOU NEED TO DO 

    $dbhost = "-"; 
    $dbuser = "-"; 
    $dbpass = "-"; 
    $dbname = "-"; 
    $dbtable = "-"; 

// END CHANGING STUFF 

$cdate = date("Y-m-d"); // get current date 


// first thing that we are going to do is make some functions for writing out 
// and excel file. These functions do some hex writing and to be honest I got 
// them from some where else but hey it works so I am not going to question it 
// just reuse 


// This one makes the beginning of the xls file 
function xlsBOF() { 
    $output = pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); 
    return; 
} 

// This one makes the end of the xls file 
function xlsEOF() { 
    $output .= pack("ss", 0x0A, 0x00); 
    return; 
} 

// this will write text in the cell you specify 
function xlsWriteLabel($Row, $Col, $Value) { 
    $L = strlen($Value); 
    $output .= pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); 
    $file = fopen("exported.xls","w"); 
    fwrite($file, "$output"); 
    fclose($file); 
    return; 
} 



// make the connection an DB query 
$dbc = mysql_connect($dbhost , $dbuser , $dbpass) or die(mysql_error()); 
mysql_select_db($dbname); 
$q = "SELECT * FROM ".$dbtable." WHERE date ='$cdate'"; 
$qr = mysql_query($q) or die(mysql_error()); 


// Ok now we are going to send some headers so that this 
// thing that we are going make comes out of browser 
// as an xls file. 
// 
//header("Pragma: public"); 
//header("Expires: 0"); 
//header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
//header("Content-Type: application/force-download"); 
//header("Content-Type: application/octet-stream"); 
//header("Content-Type: application/download"); 

//this line is important its makes the file name 
//header("Content-Disposition: attachment;filename=export_".$dbtable.".xls "); 

//header("Content-Transfer-Encoding: binary "); 

// start the file 
xlsBOF(); 

// these will be used for keeping things in order. 
$col = 0; 
$row = 0; 

// This tells us that we are on the first row 
$first = true; 

while($qrow = mysql_fetch_assoc($qr)) 
{ 
    // Ok we are on the first row 
    // lets make some headers of sorts 
    if($first) 
    { 
     foreach($qrow as $k => $v) 
     { 
      // take the key and make label 
      // make it uppper case and replace _ with ' ' 
      xlsWriteLabel($row, $col, strtoupper(ereg_replace("_" , " " , $k))); 
      $col++; 
     } 

     // prepare for the first real data row 
     $col = 0; 
     $row++; 
     $first = false; 
    } 

    // go through the data 
    foreach($qrow as $k => $v) 
    { 
     // write it out 
     xlsWriteLabel($row, $col, $v); 
     $col++; 
    } 

    // reset col and goto next row 
    $col = 0; 
    $row++; 

} 

xlsEOF(); 
exit(); 



?> 

Je ne sais même pas si tout cela est logique , mais j'ai ajouté fwrite dans les fonctions xlsBOF, xlsEOF et xlsWriteLabel pour essayer d'écrire les données dans le fichier exported.xls, cela pourrait-il fonctionner comme ça?

+0

Ne devrait pas fopen & co. être en xlsEOF? xlsWriteLabel est appelé pour chaque cellule. – Krab

+0

Je vais essayer, merci. Je vous tiendrai au courant des progrès. – Odyss3us

1

J'ai beaucoup utilisé le PEAR Spreadsheet_Excel_Writer dans mes projets et cela fonctionne bien. Cependant, il génère des fichiers au niveau Excel 5.0, ce qui peut ne pas suffire à vos besoins si vous avez besoin d'un fichier plus avancé, mais il générera un .xls natif, et pas seulement un .csv se faisant passer pour .xls.

Questions connexes