probleme php excel et boucle while

Eléphanteau du PHP | 18 Messages

01 août 2017, 14:11

bonjour à tous ,

comme indiqué dans le titre ,

l'utilisateur fais une sélection de champs et l'enregistre dans la bdd table requete .

une fois sa requête enregistré , il peut cliquer sur un bouton pour exporter en fichier excel .

mon problème est dans la création du fichier excel , autant j'arrive bien à agrémenter le nom des colonnes en fonction de la requête sélectionné .

par contre avec la boucle while pour les resultats , cela pose un problème ...

voila le code et merci d'avance pour votre aide

Code : Tout sélectionner

include 'Classes/PHPExcel.php'; include 'Classes/PHPExcel/PHPExcel/IOFactory.php'; // création des objets de base et initialisation des informations d'entête $classeur = new PHPExcel; $classeur->getProperties()->setCreator("Annie Gagnon"); $classeur->setActiveSheetIndex(0); $feuille=$classeur->getActiveSheet(); for($col = 'A'; $col !== 'ZZ'; $col++) { $classeur->getActiveSheet()->getColumnDimension($col)->setAutoSize(true); } // ajout des données dans la feuille de calcul $feuille->setTitle('Nom affiché dans l\'onglet'); $nom_requete = 'test 4'; $resultats=$connexion->query("SELECT * FROM Requete WHERE nom_requete ='" . $nom_requete . "'"); $resultats->setFetchMode(PDO::FETCH_OBJ); $result = $resultats->fetch(); $u=0; if(($result->ref_client) == true ) { $feuille->setCellValueByColumnAndRow($u,1,'Ref client'); $u++; } if(($result->part_number) == true ) { $feuille->setCellValueByColumnAndRow($u,1,'Part number'); $u++;} if(($result->collection_client) == true ) { $feuille->setCellValueByColumnAndRow($u,1,'Collection client'); $u++;} if(($result->collection_origine) == true ) { $feuille->setCellValueByColumnAndRow($u,1,'Collection origine'); $u++;} if(($result->nom_origine) == true ) { $feuille->setCellValueByColumnAndRow($u,1,'Nom origine'); $u++;} if(($result->nom_final) == true ) { $feuille->setCellValueByColumnAndRow($u,1,'Nom final'); $u++;} $login_requete = 'AMORET'; $resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$login_requete."'"); $resultats->setFetchMode(PDO::FETCH_OBJ); $i=2; $k=A; while ( $donnees = $resultats->fetch() ) { if(($result->ref_client) == true ) { $feuille->SetCellValue($k.$i,$donnees->ref_client); } if(($result->part_number) == true ) { $feuille->SetCellValue($k.$i,$donnees->part_number); } if(($result->collection_client) == true ) { $feuille->SetCellValue($k.$i,$donnees->collection_client); } if(($result->collection_origine) == true ) { $feuille->SetCellValue($k.$i,$donnees->collection_origine); } if(($result->nom_origine) == true ) { $feuille->SetCellValue($k.$i,$donnees->nom_origine); } if(($result->nom_final) == true ) { $feuille->SetCellValue($k.$i,$donnees->nom_final); } $i++; } // envoi du fichier au navigateur header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="'.$nom_requete.'.xlsx"'); header('Cache-Control: max-age=0'); $writer = PHPExcel_IOFactory::createWriter($classeur, 'Excel2007'); $writer->save('php://output'); ?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8178 Messages

01 août 2017, 16:17

Bonjour,
par contre avec la boucle while pour les resultats , cela pose un problème ...
Ça serait plus simple pour t'aider si tu décrivais le problème en fait :-D
Quel est le message d'erreur ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 1552 Messages

01 août 2017, 16:23

Il me semble qu'il te faudrait incrémenter ton $k dans ta boucle après chque IF mais comme k est un string, il te faudrait une fonction char($k) avec $k entier afin de l'incrémenter correctement.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Eléphanteau du PHP | 18 Messages

01 août 2017, 16:33

bonjour à vous ,

spols tu as bien compris mon problème ......

peux tu me detailler cela un peu plus simplement .( je ne connais pas la fonction char )

car en effet , le $k est pris dans la boucle et du coup , quand je lui donne la valeurs A , et que je fais $k++ ,

il me decale tous les resultats

le but étant que comme les entêtes des colonnes , le $k s incrémente automatiquement pour chaque colonne

merci de votre aide

ps: désolé si le message n'était pas très clair au début :oops:

Eléphanteau du PHP | 18 Messages

01 août 2017, 17:06

plus personne ??

spols ...... :D au secours !!!!!

Mammouth du PHP | 1552 Messages

02 août 2017, 08:16

Un peu de patience, je ne vis pas sur ce forum.

en déffinissant ta variable $k à 65 (valeur de la lettre A en ASCI) et en utilisant ta variable comme ceci
chr($k) tu pourras faire un $k++ et ainsi afficher A, B, C, ... comme désiré. Juste faire attention si tu dépasse 26 colonnes, chr(91) = [

pour t'aider,
http://www.php.net/chr
http://www.asciitable.com/

PS il faudra que tu définisse $k = 65 en tout début de boucle, et pas juste avant celle-ci.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Mammouth du PHP | 554 Messages

02 août 2017, 18:23

je te propose de ranger les données dans un tableau contenant en premier un sous tableau d'en-tête et en second des sous-tableaux des produits.
$header = array(); //entête de colonnes
$datas = array(); //entêtes + lignes

$nom_requete = 'test 4';
$resultats=$connexion->query("SELECT * FROM Requete WHERE nom_requete ='" . $nom_requete . "'");
$resultats->setFetchMode(PDO::FETCH_OBJ);
$result = $resultats->fetch();
if(($result->ref_client) == true )
{
    $header[] = 'Ref client';

}
if(($result->part_number) == true )
{
    $header[] = 'Part number';

}
if(($result->collection_client) == true )
{
    $header[] = 'Collection client';

}
if(($result->collection_origine) == true )
{
    $header[] = 'Collection origine';

}
if(($result->nom_origine) == true )
{
    $header[] = 'Nom origine';
}
if(($result->nom_final) == true )
{
$feuille->setCellValueByColumnAndRow($u,1,'Nom final');
    $header[] = 'Nom final';

}

  $datas =array($header);

$login_requete = 'AMORET';
$resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$login_requete."'");
$resultats->setFetchMode(PDO::FETCH_OBJ);

while ( $donnees = $resultats->fetch() )
{
        $ligne =array();// enregistrement produit
         $ligne[] = $donnees->ref_client;
        $ligne[] =  $donnees->part_number;
        $ligne[] = $donnees->collection_client;
         $ligne[] = $donnees->collection_origine;
        $ligne[] = $donnees->nom_origine;
        $ligne[] = $donnees->nom_final;
        $datas[] = $ligne;
}


  $objPHPExcel = new PHPExcel();
$lastCell = '';
  $worksheet = $objPHPExcel->getActiveSheet();
  //parcours des entêtes
  foreach($datas as $lig => $cols) {
      //pour chaque entête donné, on remplit toutes les lignes de cet entête
    foreach($cols as $col => $value) {
        $worksheet->setCellValueByColumnAndRow($col, $lig+1 , $value);

    }
        


  }
    //dernière colonne
    $lastCell=$worksheet->getHighestColumn();
    //entête en gras
    $objPHPExcel->getActiveSheet()->getStyle("A1:{$lastCell}1")->getFont()->setBold(true);
    $objPHPExcel->setActiveSheetIndex(0);

    header('Content-type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="produit.xlsx"');
   $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
   $objWriter->save('php://output');