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

Eléphanteau du PHP | 44 Messages

24 févr. 2022, 12:22

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);
}
L'illogisme n'est que la logique des autres!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 févr. 2022, 16:41

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
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 44 Messages

24 févr. 2022, 17:07

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!??
L'illogisme n'est que la logique des autres!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 févr. 2022, 18:24

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);
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 44 Messages

24 févr. 2022, 18:31

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.
L'illogisme n'est que la logique des autres!

Mammouth du PHP | 1029 Messages

25 févr. 2022, 11:44

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.
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 44 Messages

25 févr. 2022, 12:00

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
L'illogisme n'est que la logique des autres!

Mammouth du PHP | 2703 Messages

25 févr. 2022, 13:28

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é.

Eléphanteau du PHP | 44 Messages

28 févr. 2022, 11:16

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.
L'illogisme n'est que la logique des autres!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

28 févr. 2022, 12:43

Je t'ai donné le code pour supprimer une ligne avec removeRow(), qu'est-ce qui ne fonctionne pas ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 44 Messages

28 févr. 2022, 12:53

Le removeRow() ne me retire absolument aucune ligne...
L'illogisme n'est que la logique des autres!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

28 févr. 2022, 13:14

C'est que tu l'utilises mal car c'est la bonne fonction.
Donc il faut que tu avances dans ton debugage.
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 1029 Messages

03 mars 2022, 18:36

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);
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 44 Messages

04 mars 2022, 11:03

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!
L'illogisme n'est que la logique des autres!

Eléphanteau du PHP | 44 Messages

04 mars 2022, 11:06

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
L'illogisme n'est que la logique des autres!