Page 1 sur 2

[PHP SpreadSheet] Sélection d'une seule ligne

Posté : 24 févr. 2022, 12:22
par GuillaumeLM
Bonjour @ tous,
je suis toujours sur le même fichier, mais là je cherche à exclure les lignes, d'un tableau excel, qu'il trouve en inconnu, et les ressortir dans un nouveau fichier excel, mais voilà, je n'arrive pas à trouver comment sélectionner une ligne puis l'intégrer dans ce nouveau fichier avec PHPSpreadSheet.

J'ai bien vu qu'on pouvait sélectionner des cellules de manière unique ou en groupe, mais je ne trouve rien sur des lignes!?

Actuellement, il me ressort la totalité du fichier d'origine, donc toutes les lignes, et m’envoie bien les mails correspondant aux bonnes lignes en erreur...

Merci d'avance pour votre aide!
<?php
require_once "config.php";
require_once "vendor/autoload.php";

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;

$rowError = array();
if ($dir = opendir('C:\laragon\www\xlsxToCsv\Import')) {
    while (false !== ($file = readdir($dir))) {
        if ($file != ".." && $file != "." && $file != "ERREUR" && $file != "IMPORTER" && $file != "ARCHIVES" && $file != "Entete_type.xlsx" && $file != "Thumbs.db") {
            $reader = new Xlsx();
            $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
            $spreadsheet = $reader->load('C:\laragon\www\xlsxToCsv\Import\\' . $file);
            $sheetData = $spreadsheet->getActiveSheet()->toArray();
            if (!empty($sheetData)) {
                for ($i = 1; $i < count($sheetData); $i++) { //Saut de la 1ere ligne entete
                    $numMag = $sheetData[$i][10];
                    $libMag = $sheetData[$i][11];
                    $row = $sheetData[$i];
                    $searchMag = Find_mag($numMag);
                    if (empty($searchMag)) {
                        $dest = "";
                        $headers  = "MIME-Version: 1.0" . "\r\n";
                        $headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
                        $message = "<html>
                        <head>
                        <title></title>
                        </head>
                        <body>
                        </body>
                        </html>";
                        mail($dest, "", $message, $headers);
                        array_push($rowError, $i);
                        $writer->setOffice2003Compatibility(true);
                        $writer->save("./Erreurs/errorList.xlsx");
                    }
                }
            }
        }
    }
    closedir($dir);
}

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 24 févr. 2022, 16:41
par @rthur
Dans ton for() tu parcours toutes tes lignes une par une, donc c'est à ce niveau que tu regardes si cette ligne est à inclure dans ton futur tableau ou pas, et ensuite tu crées un nouveau fichier Excel en suivant la doc : https://phpspreadsheet.readthedocs.io/e ... ello-world

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 24 févr. 2022, 17:07
par GuillaumeLM
Dans ton for() tu parcours toutes tes lignes une par une, donc c'est à ce niveau que tu regardes si cette ligne est à inclure dans ton futur tableau ou pas,
La dessus nous sommes d'accord!
et ensuite tu crées un nouveau fichier Excel en suivant la doc : https://phpspreadsheet.readthedocs.io/e ... ello-world
c'est bien ce lien (et d'autres) qui m'a servi a construire ce code mais je n'ai aucun moyen de sélectionner une ligne x ou y...
A moins de passer par un triptyque fopen, fput, fclose!??

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 24 févr. 2022, 18:24
par @rthur
Ma proposition n'était pas de sélectionner une ligne.
Mais bien de récupérer le contenu des lignes qui t'intéressaient pour ensuite reconstruire un autre fichier avec les données utiles.

Si ton besoin est juste d'avoir le même fichier avec des lignes en moins, tu peux utiliser la fonction removeRow() pour supprimer les lignes souhaitées :
$objPHPExcel->getActiveSheet()->removeRow(NUM_LIGNE_A_SUPPRIMER, 1);

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 24 févr. 2022, 18:31
par GuillaumeLM
D'accord, je me suis mal exprimer, pardon, ce que je veux c'est récupérer certaines lignes seulement sans modifier le fichier original, et donc, créer un nouveau fichier avec ces quelques lignes.
En gros, un équivalent addRow() serait génial.

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 25 févr. 2022, 11:44
par Maitrepylos
Si je comprend bien, dans votre for, vous récupérez vos lignes dans un tableau et ensuite vous créez un fichier au départ de ce nouveau tableau.

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 25 févr. 2022, 12:00
par GuillaumeLM
Bonjour, pour tenter d’être le plus clair possible, je reçois un fichier X avec une liste de magasin dans lequel mon 1er for va vérifier la présence dans la base de données de ces magasins.
S'ils sont bien présents, mon programme passe à la suite, s'ils ne sont pas présent, je veux une ressortie des magasins en erreur dans un nouveau fichier Y.
Et donc actuellement j'ai une sortie de la totalité du fichier X.
Merci

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 25 févr. 2022, 13:28
par or 1
https://www.php.net/manual/fr/function.copy.php pour faire une copie du fichier original, et supprimer les lignes comme indiqué par @rthur dans le fichier copié.

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 28 févr. 2022, 11:16
par GuillaumeLM
Bonjour,
Désolé, je n'y arrive pas, soit j'ai des erreurs soit il me crée un fichier xlsx identique au 1er sans aucun tri dedans... Ou encore, une feuille excel vierge.

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 28 févr. 2022, 12:43
par @rthur
Je t'ai donné le code pour supprimer une ligne avec removeRow(), qu'est-ce qui ne fonctionne pas ?

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 28 févr. 2022, 12:53
par GuillaumeLM
Le removeRow() ne me retire absolument aucune ligne...

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 28 févr. 2022, 13:14
par @rthur
C'est que tu l'utilises mal car c'est la bonne fonction.
Donc il faut que tu avances dans ton debugage.

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 03 mars 2022, 18:36
par Maitrepylos
est-ce que ceci, approche ce que vous voulez faire ?
<?php
require_once "config.php";
require_once "vendor/autoload.php";

use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

$rowError = [];
if ($dir = opendir('C:\laragon\www\xlsxToCsv\Import')) {
    $a=1;
    while (false !== ($file = readdir($dir))) {
        if ($file != ".." && $file != "." && $file != "ERREUR" && $file != "IMPORTER" && $file != "ARCHIVES" && $file != "Entete_type.xlsx" && $file != "Thumbs.db") {
            $reader = new Xlsx();
            $spreadsheet = $reader->load('C:\laragon\www\xlsxToCsv\Import\\' . $file);
            $sheetData = $spreadsheet->getActiveSheet()->toArray();
            if (!empty($sheetData)) {
                for ($i = 1, $iMax = count($sheetData); $i < $iMax; $i++) { //Saut de la 1ere ligne entete
                    $numMag = $sheetData[$i][10];
                    $libMag = $sheetData[$i][11];
                    $row = $sheetData[$i];
                    $searchMag = Find_mag($numMag);
                    if (empty($searchMag)) {
                        $recup [] = $numMag;
                    }

                }
            }

        }
    }
    $excel = new Spreadsheet();
    $excel->fromArray(
        $recup,
        null,
        'A2'
    );
    $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($excel);
    $writer->setOffice2003Compatibility(true);
    $writer->save("./Erreurs/errorList".$a.".xlsx");
    $a++;
}
closedir($dir);

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 04 mars 2022, 11:03
par GuillaumeLM
Bonjour, après une maladie et de nombreuses tentative, je reviens vers vous car, désormais, j'arrive à sortir mon fichier excel, avec le bon nombre de lignes en erreurs, mais, avec les dernières lignes du tableau original.
Pour tenter d'être le plus clair possible, je sais que j'ai au total 14 lignes en erreur sur mon tableau original, or, il me sort, sur le fichier erreur, les 14 dernières lignes du tableau original, et non les vraies lignes qui sont en erreurs.
<?php
require_once "config.php";
require_once "vendor/autoload.php";

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxW;

$rowError = array();
if ($dir = opendir('C:\laragon\www\xlsxToCsv\Import')) {
    while (false !== ($file = readdir($dir))) {
        if ($file != ".." && $file != "." && $file != "ERREUR" && $file != "IMPORTER" && $file != "ARCHIVES" && $file != "Entete_type.xlsx" && $file != "Thumbs.db") {
            $reader = new Xlsx();
            $spreadsheet = $reader->load('C:\laragon\www\xlsxToCsv\Import\\' . $file);
            $writer = $spreadsheet;
            $sheet = $writer->getActiveSheet();
            $sheetData = $spreadsheet->getActiveSheet()->toArray();
            if (!empty($sheetData)) {
                for ($i = 1; $i < count($sheetData); $i++) { //Saut de la 1ere ligne entete
                    $j = 1;
                    $numMag = $sheetData[$i][10];
                    $libMag = $sheetData[$i][11];
                    $searchMag = Find_mag($numMag);
                     if (empty($searchMag)) {
                        $j++;
                        $dest = "";
                        $headers  = "MIME-Version: 1.0" . "\r\n";
                        $headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
                        $message = "<html>
                        <head>
                        <title></title>
                        </head>
                        <body>
                        <p>Attention,</p>
                        <p>Le magasin " . $numMag . " " . $libMag . ", à la ligne " . ($i + 1) . " du fichier excel n'est pas présent dans la base.</p>
                        <p>Vous devez le créer avant de pouvoir traiter le fichier.</p>
                        </body>
                        </html>";
                        mail($dest, "", $message, $headers);
                        array_push($rowError, $i);
                    }
                    else {
                        $sheet->removeRow(($j+1), 1);
                    }
                }
            }
            $writer = new XlsxW($writer);
            $writer->save("./Erreurs/errorList.xlsx");
        }
    }
    closedir($dir);
}
Voilà la mise à jour du code.

Encore merci d'avance!

Re: [PHP SpreadSheet] Sélection d'une seule ligne

Posté : 04 mars 2022, 11:06
par GuillaumeLM
est-ce que ceci, approche ce que vous voulez faire ?
Plus ou moins, puisqu'il me faudrait la ligne au complet et pas seulement les quelques champs de recherche, en passant par le removeRow() j'arrive presque à avoir ce que je veux