Lecture d'un fichier excel de plus 200 lignes avec PHPExcel

ksomda 36 Messages postés lundi 17 février 2014Date d'inscription 2 septembre 2016 Dernière intervention - 1 sept. 2016 à 19:36 - Dernière réponse : ksomda 36 Messages postés lundi 17 février 2014Date d'inscription 2 septembre 2016 Dernière intervention
- 2 sept. 2016 à 19:19
Bonjour,
Je viens vers vous pour solliciter de l'aide.
Actuellement, j'importes un fichier excel contenant maximum 15 lignes avec une seule feuille de tableur. Cette importation marche.
Toutefois, j'ai constaté que avec les fichiers qui seront importés dans mon application contiendront plus de 200 lignes ce nombre est évolutif.
Aussi, avec la méthode de lecture avec PHPExcel que j'ai adopté, mon code php n'arrive pas à obtenir le nombre de lignes car le nombre de colonnes est fixe.
Veuillez trouvez ci - dessous le code de traitement pour les détails.
if (isset($_SESSION['user'])) {
        $compt = $_SESSION['user'];
        $idUsersconnectes = $compt['idUsers'];
        $cpt = "SELECT idUsers, nomUsers, prenomUsers, login, idGroupe FROM VUTILISATEUR WHERE supUsers='1' AND idUsers='$idUsersconnectes'";
        $results = $idcom->query($cpt);
        $row = $results->fetch(PDO::FETCH_ASSOC);
        $idUsers = $row['idUsers'];
        $nomUsers = strtoupper($row['nomUsers']);
        $prenomUsers = $row['prenomUsers'];
        $login = $row['login'];
        $user = $nomUsers . " " . $prenomUsers;
        setlocale(LC_TIME, 'fra_fra');
        $dateSaving = utf8_decode(utf8_encode(gmstrftime('%A %d %B %Y, %H:%M')));
        $target_galerie = "../ressources/upload/";
        $target_file = $target_galerie . basename($_FILES["fichier"]["name"]);
        if (!move_uploaded_file($_FILES["fichier"]["tmp_name"], $target_file)) {
            header("location: ../views/accueil.php?");
        }
        if ($target_file) {
            $fichiers = $_FILES["fichier"]["name"];
            if (file_exists($target_file)) {
                if ($_FILES["fichier"]["size"] > 0) {
                    include("../ressources/PHPExcel/Classes/PHPExcel/IOFactory.php");
                    $objReader = PHPExcel_IOFactory::createReader('Excel2007');
                    $objReader->setReadDataOnly(true);
                    $objPHPExcel = $objReader->load($target_file);
                    $objWorksheet = $objPHPExcel->getActiveSheet();
                    $highestRow = $objWorksheet->getHighestRow(); // e.g. 10 
                    for ($row = 5; $row <= $highestRow; $row++) {
                        $name0 = $objWorksheet->getCellByColumnAndRow(0, $row)->getValue();
                        $name1 = utf8_decode($objWorksheet->getCellByColumnAndRow(1, $row)->getValue());
                        $name2 = utf8_decode(PHPExcel_Style_NumberFormat::toFormattedString($objWorksheet->getCellByColumnAndRow(2, $row)->getValue(), 'YYYY-MM-DD'));
                        $name3 = utf8_decode($objWorksheet->getCellByColumnAndRow(3, $row)->getValue());
                        $name4 = utf8_decode($objWorksheet->getCellByColumnAndRow(4, $row)->getValue());
                        $name5 = utf8_decode($objWorksheet->getCellByColumnAndRow(5, $row)->getValue());
                        $name6 = utf8_decode($objWorksheet->getCellByColumnAndRow(6, $row)->getValue());
                        $name7 = utf8_decode($objWorksheet->getCellByColumnAndRow(7, $row)->getValue());
                        $name8 = utf8_decode($objWorksheet->getCellByColumnAndRow(8, $row)->getValue());
                        $name9 = utf8_decode(PHPExcel_Style_NumberFormat::toFormattedString($objWorksheet->getCellByColumnAndRow(9, $row)->getValue(), 'YYYY-MM-DD'));
                        $name10 = utf8_decode($objWorksheet->getCellByColumnAndRow(10, $row)->getValue());
                        $name11 = utf8_decode($objWorksheet->getCellByColumnAndRow(11, $row)->getValue());
                        $name12 = utf8_decode($objWorksheet->getCellByColumnAndRow(12, $row)->getValue());
                        $name13 = utf8_decode($objWorksheet->getCellByColumnAndRow(13, $row)->getValue());
                        $name14 = utf8_decode($objWorksheet->getCellByColumnAndRow(14, $row)->getValue());
                        $name15 = utf8_decode($objWorksheet->getCellByColumnAndRow(15, $row)->getValue());
                        $name16 = utf8_decode(PHPExcel_Style_NumberFormat::toFormattedString($objWorksheet->getCellByColumnAndRow(16, $row)->getValue(), 'YYYY-MM-DD'));
                        $name17 = utf8_decode(PHPExcel_Style_NumberFormat::toFormattedString($objWorksheet->getCellByColumnAndRow(17, $row)->getValue(), 'YYYY-MM-DD'));
                        $name18 = utf8_decode(PHPExcel_Style_NumberFormat::toFormattedString($objWorksheet->getCellByColumnAndRow(18, $row)->getValue(), 'YYYY-MM-DD'));
                        $name19 = utf8_decode(PHPExcel_Style_NumberFormat::toFormattedString($objWorksheet->getCellByColumnAndRow(19, $row)->getValue(), 'YYYY-MM-DD'));
                        $name20 = utf8_decode(strtoupper($objWorksheet->getCellByColumnAndRow(20, $row)->getValue()));
                        if ($name20 == "DEPOT1") {
                            $name21 = 2440003;
                        } elseif ($name20 == "DEPOT2") {
                            $name21 = 2440005;
                        } elseif ($name20 == "DEPOT3") {
                            $name21 = 2440008;
                        } elseif ($name20 == "DEPOT4") {
                            $name21 = 2440001;
                        }
                        $query = "INSERT INTO test (id, name1, name2, name3, name4, name5, name6, name7, 
                                      name8, name9, name10, name11, name12,name14, name15, name16, name17, name18, name19,
                                      name20, name21, volumeDeposeAuCompteur, idRespEnreg, dateRespEnreg, idRespDernierEnreg,
                                      dateRespDernierEnreg, sup)
                                      VALUES(NULL, '$name1', '$name2', '$name3', '$name4', '$name5', '$name6', '$name7', '$name8', '$name9', '$name10',
                                      '$name11', '$name12','$name14','$name15','$name16','$name17','$name18','$name19','$name20','$name21','NULL','$idUsers',
                                      '$dateSaving',NULL,NULL,'1')";
                        $result = $idcom->exec($query);
                    }
 
                    if ($result != 0) {
                        // Tout se passe bien,
                        header("location: ../views/test.php?op=2");
                    } else {
                        header("location: ../views/test.php?err=2");
                    }
                } else {
                    header("location: ../views/test.php?err=1");
                }
            } else {
// le fichier n'existe pas
                header("location: ../views/test.php?err=3");
            }
        }
    }


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

Votre réponse

8 réponses

jordane45 22888 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 octobre 2018 Dernière intervention - 1 sept. 2016 à 22:20
0
Merci
Bonjour,

Je ne comprend pas ...
avec la méthode de lecture avec PHPExcel que j'ai adopté, mon code php n'arrive pas à obtenir le nombre de lignes car le nombre de colonnes est fixe

Quel est le rapport avec un nombre de colonne fixe... et le fait qu'il n'arrive pas à "obtenir" le nombre de lignes ???

As tu essayé de faire un echo de ta variable
$highestRow 
?
Qu'est-ce que ça t'affiche ??

De plus... ne serait-ce pas du au max_execution_time paramétré dans ton php.ini ?
Quelle est la taille du fichier excel (en méga) ?

Ensuite.. pourquoi faire des
 utf8_decode(utf8_encode
???
Pourquoi ne forces-tu pas, via le header, à dire que tu travailles en utf8 directement ?
Par exemple en utilisant :
header('Content-Type: text/html; charset=utf-8');


Puis.... le temps des tests.. retire les redirections pour que tu puisses voir les éventuels messages d'erreur s'afficher sur ta page ! (et remplaces les par des ECHO éventuellement)


et enfin.... vu que tu sembles travailler en PDO... je t'invite fortement à y activer la gestion des erreurs et à utiliser les requêtes préparées
voir ceci :
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
http://www.commentcamarche.net/faq/27489-pdo-une-autre-facon-d-acceder-a-vos-bases-de-donnees

Commenter la réponse de jordane45
ksomda 36 Messages postés lundi 17 février 2014Date d'inscription 2 septembre 2016 Dernière intervention - 2 sept. 2016 à 10:31
0
Merci
Bonjour Jordane45, merci pour ta réponse. Pour les questions que tu m'a posé voici les reponse:
1. Je ne pense pas qu'il ya un lien mais j'ai exposé mon soucis pour avoir de l'aide.
2. Lorsque je vais echo de la variable
$highestRow
je trouve le nombre
1
.
3. La taille du fichier est compris entre 5 - 20 Méga pourtant dans le fichier php.ini de mon wampserver,
j'ai ces lignes
upload_max_filesize = 64M
et
max_file_uploads = 20
.
4. Au niveau de la balise
<head></head>
j'ai déjà défini une balise
<meta></meta>
comme ceci:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
jordane45 22888 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 octobre 2018 Dernière intervention - 2 sept. 2016 à 13:34
et le max_execution_time ? (ou le set_time_limit plus exactement ?)
ksomda 36 Messages postés lundi 17 février 2014Date d'inscription 2 septembre 2016 Dernière intervention > jordane45 22888 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 octobre 2018 Dernière intervention - 2 sept. 2016 à 14:54
max_execution_time est à 1200. Dans mon fichier php.ini il n'ya pas de ligne à propos de set_time_limit
Commenter la réponse de ksomda
jordane45 22888 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 octobre 2018 Dernière intervention - Modifié par jordane45 le 2/09/2016 à 15:43
0
Merci
On va reprendre dans l'ordre ....

Peux tu tester le code suivant et me dire ce que ça te retourne ?
//A placer au début de ton fichier php
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL', (PHP_SAPI == 'cli') ? PHP_EOL : '<br/>');


Puis dans le traitement du fichier excel :
 if ($_FILES["fichier"]["size"] > 0) {
   require_once("../ressources/PHPExcel/Classes/PHPExcel/IOFactory.php");

   $objReader = PHPExcel_IOFactory::createReader('Excel2007');
   $objReader->setReadDataOnly(true);
   $objPHPExcel = $objReader->load($target_file);
   $objWorksheet = $objPHPExcel->getActiveSheet();
   $sheetData = $objWorksheet ->toArray(null, true, true, true);

    echo ' Highest Column ' . $getHighestColumn = $objPHPExcel->setActiveSheetIndex()->getHighestColumn(); // Get Highest Column
    echo ' Get Highest Row ' . $getHighestRow = $objPHPExcel->setActiveSheetIndex()->getHighestRow(); // Get Highest Row

  echo "<pre>";
   print_r($sheetData);
  echo "</pre>";

}


Cordialement, 
Jordane                                                                 
ksomda 36 Messages postés lundi 17 février 2014Date d'inscription 2 septembre 2016 Dernière intervention - 2 sept. 2016 à 16:23
j'ai intéressé dans le code que tu m'a dit de placer au début de mon fichier php.
J'ai ajouter également le code de traitement de Excel. Voici ce résultat.

Highest Column A
Get Highest Row 1
Array
(
[1] => Array
(
[A] =>
)

)
jordane45 22888 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 octobre 2018 Dernière intervention > ksomda 36 Messages postés lundi 17 février 2014Date d'inscription 2 septembre 2016 Dernière intervention - 2 sept. 2016 à 17:33
Ton fichier exclel ne contiendrait pas plusieurs onglets par hasard ????
ksomda 36 Messages postés lundi 17 février 2014Date d'inscription 2 septembre 2016 Dernière intervention > jordane45 22888 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 19 octobre 2018 Dernière intervention - 2 sept. 2016 à 19:19
Le fichier que j'ai uploadé avec ton code contient une seule feuille.
Cependant, j'ai testé ton code avec un fichier contenant plusieurs onglet. L'instruction

echo "<pre>";
print_r($sheetData);
echo "</pre>";
me renvoit une page blanche vide sans erreur.
Dans ce cas, j'ai fait un débogage avec:

var_dump($_POST);
var_dump($_FILES);
die();
je trouve les résultats suivants:

array (size=0)
empty
array (size=0)
empty
Commenter la réponse de jordane45

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.