[RESOLU] Création d'un fichier Excel et copie d'un autre

Eléphant du PHP | 65 Messages

06 déc. 2017, 11:59

Bien le bonjour à tous,
J'ai besoin de votre aide.
Voilà je suis entrain de faire un bout de code qui consiste à créer un fichier excel et ensuite d'y copier les données provenant d'un fichier excel existant. Le but en fait est de classer les données de 1208 fichiers excel dans un seul en enlevant les doublons par la suite mais cela sera un autre problème.
Mes fichiers sont classés par nombre. Le premier étant : 201705031017. Lorsque le code tombe sur ce chiffre il comprend donc que c'est le premier fichier et crée alors un nouveau fichier dans lequel il copiera le fichier 201705031017.xlsx. Ensuite il continuera sa boucle afin d'y ajouter, dans ce nouveau fichier, toutes les données des autres fichiers existants.
Voici mon code:

Code : Tout sélectionner

<h1>Tri excel</h1> <main> <?php $dossier=""; $nb_fichier=0; //Scan du dossier Fichier_excel if($dossier = opendir('./Fichiers_excel')) { while(false !== ($fichier = readdir($dossier))) { // le count inclut toujours le dossier actuel et le dossier parent d'où ce test avec le . et le .. if($fichier != '.' && $fichier != '..') { //$file2 = substr(pathinfo($fichier, PATHINFO_FILENAME), 1); $nb_fichier++; //echo '<li><a href="./csv/' . $fichier . '">' . $fichier . '</a></li>'; } } //echo $nb_fichier; echo '</ul><br />'; $ok=1; closedir($dossier); } else { echo 'Le dossier n\' a pas pu être ouvert'; } if($ok==1) { echo "<div id=\"rslt\">"; if($nb_fichier<0) { echo 'Il n\'y a aucun fichier dans le dossier'; } else { echo 'Il y a <strong>&nbsp;' . $nb_fichier . '&nbsp;</strong> fichier(s) dans le dossier'; echo "</div>"; //On utilise la bibliothéque Excel require_once('Lib_excel/Classes/PHPExcel.php'); if($dossier = opendir('./Fichiers_excel')) { while(false !== ($fichier = readdir($dossier))) { //echo $fichier; if($fichier != '.' && $fichier != '..') { $file2 = substr(pathinfo($fichier, PATHINFO_FILENAME), 0); echo $file2; if($file2=="201705031017") { //Création d'un nouveau fichier Excel //Fichier nécessaire à la génération du tableur include 'Lib_excel/Classes/PHPExcel.php'; include 'Lib_excel/Classes/PHPExcel/Writer/Excel2007.php'; //Instanciation du nouveau projet Excel $workbook = new PHPExcel; //Activation de la feuille de travail (celle par défaut) $sheet = $workbook->getActiveSheet(); //Copie des données du premier fichier ouvert [b][color=#FF0000] C'est ici que j'ai besoin de votre aide.[/color][/b] //Instanciation d'un objet writer spécifique au type de tableau que nous voulons générer $writer = new PHPExcel_Writer_Excel2007($workbook); //On donne un nom au fichier et on l'enregistre $records = './Fichiers_excel/Fichier_final.xlsx'; $writer->save($records); } else { // Chargement du premier fichier Excel try { $inputFileType = PHPExcel_IOFactory::identify("./Fichiers_excel/".$fichier); $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objPHPExcel = $objReader->load("./Fichiers_excel/".$fichier); $sheet = $objPHPExcel->getActiveSheet() ; echo 'Premier fichier ouvert'; } catch(Exception $e) { die('<br>Error loading file "'.pathinfo($fichier,PATHINFO_BASENAME).'": '.$e->getMessage()); } if($file2<201707181524) { } else { } //Libération de l'espace mémoire de la seconde feuille $objPHPExcel1->disconnectWorksheets(); unset($objPHPExcel1); echo 'Traitement des 2 fichiers'; } } } closedir($dossier); } else { echo 'Le dossier n\' a pas pu être ouvert'; } } } ?> </main>
J'ai bien trouvé des bouts de code pour la copie mais je n'arrive pas à l'implémenter dans mon code.
Je vous remercie d'avance.

Eléphant du PHP | 65 Messages

06 déc. 2017, 12:11

J'ai modifié un peu mon code afin d'éviter une redondance d'ouverture de fichier et j'y ai mis un bout de code pour la copie mais celà ne fonctionne aps.

Code : Tout sélectionner

<h1>Tri excel</h1> <main> <?php $dossier=""; $nb_fichier=0; //Scan du dossier Fichier_excel if($dossier = opendir('./Fichiers_excel')) { while(false !== ($fichier = readdir($dossier))) { // le count inclut toujours le dossier actuel et le dossier parent d'où ce test avec le . et le .. if($fichier != '.' && $fichier != '..') { //$file2 = substr(pathinfo($fichier, PATHINFO_FILENAME), 1); $nb_fichier++; //echo '<li><a href="./csv/' . $fichier . '">' . $fichier . '</a></li>'; } } //echo $nb_fichier; echo '</ul><br />'; $ok=1; closedir($dossier); } else { echo 'Le dossier n\' a pas pu être ouvert'; } if($ok==1) { echo "<div id=\"rslt\">"; if($nb_fichier<0) { echo 'Il n\'y a aucun fichier dans le dossier'; } else { echo 'Il y a <strong>&nbsp;' . $nb_fichier . '&nbsp;</strong> fichier(s) dans le dossier'; echo "</div>"; //On utilise la bibliothéque Excel require_once('Lib_excel/Classes/PHPExcel.php'); if($dossier = opendir('./Fichiers_excel')) { while(false !== ($fichier = readdir($dossier))) { //echo $fichier; if($fichier != '.' && $fichier != '..') { try { $inputFileType = PHPExcel_IOFactory::identify("./Fichiers_excel/".$fichier); $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objPHPExcel = $objReader->load("./Fichiers_excel/".$fichier); $sheet = $objPHPExcel->getActiveSheet() ; echo 'Premier fichier ouvert'; } catch(Exception $e) { die('<br>Error loading file "'.pathinfo($fichier,PATHINFO_BASENAME).'": '.$e->getMessage()); } $file2 = substr(pathinfo($fichier, PATHINFO_FILENAME), 0); echo $file2; if($file2=="201705031017") { //Création d'un nouveau fichier Excel //Fichier nécessaire à la génération du tableur include 'Lib_excel/Classes/PHPExcel.php'; include 'Lib_excel/Classes/PHPExcel/Writer/Excel2007.php'; //Instanciation du nouveau projet Excel $workbook = new PHPExcel; //Activation de la feuille de travail (celle par défaut) $sheet_rslt = $workbook->getActiveSheet(); //Copie des données du premier fichier ouvert $sheet1 = $sheet->copy(); $sheet_rslt = clone $sheet1; //Instanciation d'un objet writer spécifique au type de tableau que nous voulons générer $writer = new PHPExcel_Writer_Excel2007($workbook); //On donne un nom au fichier et on l'enregistre $records = './Fichiers_excel/Fichier_final.xlsx'; $writer->save($records); unset($sheet1); } else { } } } closedir($dossier); } else { echo 'Le dossier n\' a pas pu être ouvert'; } } } ?> </main>
En ce qui concerne l'erreur, la voici:

( ! ) Fatal error: Cannot redeclare class PHPExcel in C:\wamp64\www\Tri_excel\Lib_excel\Classes\PHPExcel.php on line 44
Call Stack
# Time Memory Function Location
1 0.0000 233144 {main}( ) ...\index.php:0
2 0.0010 251800 require( 'C:\wamp64\www\Tri_excel\View\view.php' ) ...\index.php:10
3 0.1960 6556784 include( 'C:\wamp64\www\Tri_excel\Lib_excel\Classes\PHPExcel.php' ) ...\view.php:68

Eléphant du PHP | 65 Messages

06 déc. 2017, 13:56

Bon pour l'erreur c'est bon j'ai trouvé cela venait. J'avais en fait include 2 fois la même page PHPExcel.php!
Mon fichier se crée bien or rien ne se copie à l'intérieur.

Eléphant du PHP | 65 Messages

06 déc. 2017, 14:50

J'ai apporté une petite modif à mon code.
En effet l'erreur que j'ai est:

Code : Tout sélectionner

! ) Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 68 bytes) in C:\wamp64\www\Tri_excel\Lib_excel\Classes\PHPExcel\CachedObjectStorage\Memory.php on line 55 Call Stack # Time Memory Function Location 1 0.0010 233144 {main}( ) ...\index.php:0 2 0.0130 252216 require( 'C:\wamp64\www\Tri_excel\View\view.php' ) ...\index.php:10 3 23.3300 132931232 PHPExcel_Reader_Excel2007->load( ) ...\view.php:55 4 23.5490 134186888 PHPExcel_Worksheet->getCell( ) ...\Excel2007.php:921 5 23.5490 134188456 PHPExcel_Worksheet->_createNewCell( ) ...\Worksheet.php:1186 6 23.5490 134188888 PHPExcel_CachedObjectStorage_Memory->addCacheData( ) ...\Worksheet.php:1223
Ce qui implique que tous mes fichiers sont ouvert en mémoire et qu'il n'en a pas assez ce qui est normal.
Ce que je souhaiterai c'est fermé les fichiers une fois le traitement fini avant de reboucler pour le fichier suivant.
J'ai donc rajouté des unlink dans mon code mais cela n'a pas l'air de fonctionner. Je n'ai trouvé que cela sur internet.
Pouvez-vous m'aider?
Voici mon code:

Code : Tout sélectionner

if($ok==1) { echo "<div id=\"rslt\">"; if($nb_fichier<1) { echo 'Il n\'y a aucun fichier dans le dossier'; } else { echo 'Il y a <strong>&nbsp;' . $nb_fichier . '&nbsp;</strong> fichier(s) dans le dossier<br>'; echo "</div>"; //On utilise la bibliothéque Excel require_once('./Lib_excel/Classes/PHPExcel.php'); if($dossier = opendir('./Fichiers_excel')) { while(false !== ($fichier = readdir($dossier))) { //echo $fichier; if($fichier != '.' && $fichier != '..') { try { $inputFileType = PHPExcel_IOFactory::identify("./Fichiers_excel/".$fichier); $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objPHPExcel = $objReader->load("./Fichiers_excel/".$fichier); $sheet = $objPHPExcel->getActiveSheet() ; } catch(Exception $e) { die('<br>Error loading file "'.pathinfo($fichier,PATHINFO_BASENAME).'": '.$e->getMessage()); } $file = substr(pathinfo($fichier, PATHINFO_FILENAME), 0); //echo $file2; if($file==201705031017) { //Création d'un nouveau fichier Excel //Fichier nécessaire à la génération du tableur include './Lib_excel/Classes/PHPExcel/Writer/Excel2007.php'; //Instanciation du nouveau projet Excel $workbook = new PHPExcel; //Activation de la feuille de travail (celle par défaut) $sheet_rslt = $workbook->getActiveSheet(); //Copie des données du premier fichier ouvert //$sheet1 = $sheet->copy(); //$sheet_rslt = clone $sheet1; //Instanciation d'un objet writer spécifique au type de tableau que nous voulons générer $writer = new PHPExcel_Writer_Excel2007($workbook); //On donne un nom au fichier et on l'enregistre $records = './Fichiers_excel/Fichier_final.xlsx'; $writer->save($records); echo "first<br>"; unset($sheet1); } else { if($file<=201707181524) { echo "moins<br>"; //Workbooks($fichier).Close ; unlink("./Fichiers_excel/".$fichier); } else { echo "plus<br>"; //Workbooks($fichier).Close; unlink("./Fichiers_excel/".$fichier); } } } } closedir($dossier); } else { echo 'Le dossier n\' a pas pu être ouvert'; } } }

Mammouth du PHP | 1967 Messages

06 déc. 2017, 15:45

Je ne connais pas la classe phpexcel.

mais tenter d'ouvrir 1208 fichier excel pour les regrouper même en les fermant systématiquement, risque de donner à la fin un fichier bien trop gros pour php.
les erreur survenant lors de la tentative de créer une nouvelle cellule et non pas à l'ouverture d'un nième fichier me semble une preuve de ce que j'avance.

Est-ce possible de travailler en format CSV ? ainsi il ne s'agira que de texte.
Si au final il y aura beaucoup de doublon, il faudrait peut être voir a les gérer dès le début du traitement et ainsi réduire la charge.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 1967 Messages

06 déc. 2017, 15:45

Je ne connais pas la classe phpexcel.

mais tenter d'ouvrir 1208 fichier excel pour les regrouper même en les fermant systématiquement, risque de donner à la fin un fichier bien trop gros pour php.
les erreur survenant lors de la tentative de créer une nouvelle cellule et non pas à l'ouverture d'un nième fichier me semble une preuve de ce que j'avance.

Est-ce possible de travailler en format CSV ? ainsi il ne s'agira que de texte.
Si au final il y aura beaucoup de doublon, il faudrait peut être voir a les gérer dès le début du traitement et ainsi réduire la charge.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 65 Messages

06 déc. 2017, 16:00

Non impossible de faire cela en csv. En fait j'essaie de récupérer le boulot des collègues y a eu un souci sur les fichiers avec des échanges d'id etc. Du coup je dois tout récupérer et tout mettre dans un seul fichier excel.
J'ai réussi à faire la fermeture des fichiers tout en allant. LE traitement est plutôt long j'ai du augmenté le

Code : Tout sélectionner

set_time_limit(1500);
dans mon script.
Par contre je me retrouve avec une belle erreur :

Code : Tout sélectionner

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 33554432 bytes) in C:\wamp64\www\Tri_excel\Lib_excel\Classes\PHPExcel\Reader\Excel2007.php on line 850 Call Stack # Time Memory Function Location 1 0.0000 233144 {main}( ) ...\index.php:0 2 0.0090 252184 require( 'C:\wamp64\www\Tri_excel\View\view.php' ) ...\index.php:10 3 224.0700 128292080 PHPExcel_Reader_Excel2007->load( ) ...\view.php:55 4 224.2910 129542248 __toString ( ) ...\view.php:850
Que puis-je faire contre cela?

Mammouth du PHP | 1967 Messages

06 déc. 2017, 16:10

Il existe aussi un paramètre de mémoire autorisé que tu peux modifier dans ta configuration php mais soit prudent car il affectera aussi le reste du système. regarde la taille totale de tes 1208 fichiers est-ce que cette taille te semble raisonnable pour un seul fichier ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 65 Messages

06 déc. 2017, 16:25

Oui largement ce sont de tous petits fichiers. Le total des 1208 fichiers pèse 35Mo seulement.

Mammouth du PHP | 1967 Messages

06 déc. 2017, 17:16

essaye en mettant ceci en début de code
ini_set('memory_limit', '256M');
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 65 Messages

07 déc. 2017, 11:14

Bon cela fonction e j'ai modifié dans le php.ini le memory limit et je l'ai mis à 1024 et cela fonctionne et en set_time_limit dans le code php j'ai mis 2500.
Merci beaucoup.