IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[PHPExcel] Modifier cellule excel


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut [PHPExcel] Modifier cellule excel
    Salut,

    Je bloque depuis quelques heures sur le fait de pouvoir modifier la cellule de mon fichier Excel :

    Le soucis se trouve ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ($cell != 'Created') $cell = date('d/m/Y', ($cell->getValue() - 25569) * 24 * 60 * 60);
    print_r($cell->getValue());
    En effet on remarque que la date de la cellule n'est pas modifiee, elle reste au format Excel : 42192 au lieu de 31/08/20015 par exemple.

    Ainsi, la modification de la valeur de $cell n'a pas eu lieu.

    J'ai egalement teste ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sheet->setCellValue($cell, date('d/m/Y', ($cell->getValue()- 25569)*24*60*60 ));
    Voici la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    function updateBackorder($file) {
        require_once 'Classes/PHPExcel/IOFactory.php';
        $objet = PHPExcel_IOFactory::createReader('Excel2007');
        $excel = $objet->load($file);
        $sheet = $excel->getSheet(0);
     
        echo '<table border="0">';
        foreach ($sheet->getRowIterator() as $row) {
            echo '<tr>';
            foreach ($row->getCellIterator() as $cell) {
                echo '<td>';
                if('A' == $cell->getColumn()) print_r($cell->getValue());
                else if('B' == $cell->getColumn())print_r($cell->getValue());
                else if('C' == $cell->getColumn())print_r($cell->getValue());
                else if('D' == $cell->getColumn())print_r($cell->getValue());
                else if('E' == $cell->getColumn()) {
                    if ($cell != 'Created') date('d/m/Y', ($cell->getValue() - 25569) * 24 * 60 * 60);
                    print_r($cell->getValue());
                }
                else if('F' == $cell->getColumn())print_r($cell->getValue());
                else if('G' == $cell->getColumn()){
                    if($cell != 'Exp Del Date') $cell = date('d/m/Y', ($cell->getValue() - 25569) * 24 * 60 * 60);
                    print_r($cell->getValue());
                }
                else if('H' == $cell->getColumn())print_r($cell->getValue());
                echo '</td>';
            }
            echo '</tr>';
        }
        echo '</table>';
    }
    Merci beaucoup !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    A quoi correspond cette condition ? La cellule n'est pas censée contenir une date ?

    Par ailleurs si tu veux que tes dates dans Excel soit affichées au format d/m/Y c'est le style de la cellule qu'il faut changer ; ce n'est pas la peine de réecrire la valeur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Parce que la première ligne contient l'intitulé
    par exemple :
    Created
    15/07/2015
    11/02/2015
    etc...

    Je suis obligé de la modifier pour la rentrer dans la base de donnée, la date n'est pas du type d/m/y initialement, apres encodage du fichier Excel.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Parce que la première ligne contient l'intitulé
    Tu comprends bien que $cell n'est pas la valeur de la première ligne donc ta condition n'a pas de sens.

    Je suis obligé de la modifier pour la rentrer dans la base de donnée
    Ton but de ce script est d'importer le fichier dans une base de données ? Ca serait bien de nous le dire parce que d'apres ton premier message on dirait que tu cherches a modifier le fichier Excel.
    De quelle base de donnée s'agit-il ?
    la date n'est pas du type d/m/y initialement, apres encodage du fichier Excel
    Dans quel format est la date ?
    De quel encodage operation d'encodage parles-tu ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Pour bien expliquer :
    J'ai créé une fonction qui permet de rechercher un mail reçu chaque jour avec toujours le même sujet, qui extrait cette pièce jointe, qui est un tableur excel.
    Ensuite, cette pièce jointe extraite, doit être structurée en langage HTML, à l'aide de la fonction base64_decode. Chose faite également.
    Cependant tout est correct, sauf la partie date qui est de la forme 44262 par exemple, ainsi je dois utiliser la fonction date('d/m/Y', ($cell->getValue() - 25569) * 24 * 60 * 60), qui au passage marche parfaitement.
    En effet, j'ai également créée une fonction qui affiche donc le tableur sous forme de tableau HTML avec les bonnes dates : 02/07/2015 par exemple.
    Sauf que afficher et attribuer une valeur sont des choses biens différentes.
    Puisque si j'arrive à modifier les cellules contenant les dates 422254 en format d/m/y, je peux ainsi mettre ces données dans la base de données, ce qui n'est pas encore le cas (j'arrive à mettre les autres données, comme description, id... , mais pas les données dates, comme Created dans ma table).

    Je fais ligne par ligne et par colonne, donc cell correspond à la cellule, ainsi si la cellule n'est pas 'Created', alors je modifie la date.

    Voilà, merci beaucoup!
    Désole si je n'arrive pas à mettre les bons termes sur les bons mots.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    donc cell correspond à la cellule, ainsi si la cellule n'est pas 'Created'
    $cell est un objet qui represente la cellule que tu es en train de lire ; ce n'est évidemment pas la valeur de la première cellule de la colonne.

    Sauf que afficher et attribuer une valeur sont des choses biens différentes.
    Encore une fois, tu n'as pas besoin de modifier le fichier Excel.
    Ce que tu fais pour le tableau HTML le montre bien : sans modifier le fichier Excel, tu affiches la date dans le format que tu veux.
    C'est pareil pour la base de donnée, sauf que si on parle de mysql par exemple (tu n'as pas repondu à la question) le format attendu est AAAA-MM-DD

    qui au passage marche parfaitement.
    Tu as des méthodes de classe fournie par PHPExcel qui te permette de tout faire.

    Dans le code ci-dessous, montre ce qu'il est possible de faire

    - les colonnes E et G qui contiennent toujours des dates sont retranscrites au format AAAA-MM-DD
    - pour les autres cellules, quand elles contiennent des dates sont retranscrites au format DD/MM/AAAA ; sinon sont affichées tel quel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    foreach ($sheet->getRowIterator() as $row) {
      echo '<tr>';
      foreach ($row->getCellIterator() as $cell) {
        echo '<td>';
        $data = $cell->getValue();
        if (($cell->getColumn() == 'E' || $cell->getColumn() == 'G')) {
            echo PHPExcel_Style_NumberFormat::toFormattedString($data,'YYYY-MM-DD');
        }
        else {
            if(PHPExcel_Shared_Date::isDateTime($cell)){
              echo PHPExcel_Style_NumberFormat::toFormattedString($data,'DD/MM/YY');
            }
            else {
              echo $data;
            }
        }
        echo '</td>';
      }
      echo '</tr>';
    }
    echo '</table>';
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Merci de ta réponse, j'utilise PHPMyAdmin.
    A vrai dire, je ne connais pas bien le PHP, juste le JAVA et le C, comme langage de programmation.

    Par exemple si je veux la valeur de $cell, il faut utiliser $cell->getValue() ?

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    dans ton code $cell est un objet PHPExcel qui represente la cellule Excel.
    Cet objet a une methode "getValue" qui fourni la valeur de la cellule.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    D'accord merci beaucoup sabotage, à vrai dire je ne peux pas tester ton code, je suis en stage à l'étranger et je dois automatiser des tâches, et je ne peux donc pas le tester avant mardi (jour ferié).
    Ceci dit, j'avais aussi trouvé cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHPExcel_Style_NumberFormat::toFormattedString($data,'DD/MM/YY');

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Toujours le meme soucis quand je souhaite inserer les dates dans la base de donnees, j'ai pour cela mis le test pour mettre en evidence que la date nest plus au format Y-M-D, mais du type excel : 42192

    La fonction insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    function insertDatabase($file){
        updateBackorder($file);
     
     
        require_once 'Classes/PHPExcel/IOFactory.php';
        $objPHPExcel = PHPExcel_IOFactory::load($file);
        $sheet = $objPHPExcel->getSheet(0);
        $con = mysqli_connect("localhost","interns","eFEntZrfPWPGHUGe","test_reporting");
     
        if (mysqli_connect_errno()) {
     
            echo "Failed to connect to MySQL: ".mysqli_connect_error();
        }
        else {
            echo 'Connected with phpMyAdmin.';
            $rows = array();
            foreach ($sheet->getRowIterator() as $row) {
                $i = 0;
                $data = array();
                foreach ($row->getCellIterator() as $cell) {
                  $data[$i] = $cell->getValue();
                    $i++;
                    if($i == 8) {
                        array_push($rows, $data);
                        $i = 0;
                    }
                }
            }
        }
     
        foreach ($rows as $row) {
            $pord = $row[0];
            $sku = $row[1];
            $product_name = $row[2];
            $qty = $row[3];
            $order_created_at = $row[4];
            $kwos = $row[5];
            $expected_delivery_date = $row[6];
            $alternative = $row[7];
     
            $sql =  "INSERT INTO vow_backorders (pord, sku, product_name, qty, order_created_at, kwos, expected_delivery_date, alternative) VALUES ('$pord', '$sku', '$product_name', '$qty', '$order_created_at', '$kwos', '$expected_delivery_date', '$alternative')";
            $result = $con->query($sql);
            if($result) {
                echo $order_created_at.'<br/>';
                echo ' Send.';
            }
        }
    }
    La fonction update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    function updateBackorder($file) {
        require_once 'Classes/PHPExcel/IOFactory.php';
        $objet = PHPExcel_IOFactory::createReader('Excel2007');
        $excel = $objet->load($file);
        $sheet = $excel->getSheet(0);
     
        foreach ($sheet->getRowIterator() as $row) {
            foreach ($row->getCellIterator() as $cell) {
                $data = $cell->getValue();
                if (($cell->getColumn() == 'E' || $cell->getColumn() == 'G')) {
                     PHPExcel_Style_NumberFormat::toFormattedString($data,'YYYY-MM-DD');
                }
                else {
                    if(PHPExcel_Shared_Date::isDateTime($cell)){
                         PHPExcel_Style_NumberFormat::toFormattedString($data,'DD/MM/YY');
                    }
                    else {
                    }
                }
            }
        }
     
        deleteToTest('Backorder.xlsx');
        $newFile = 'Backorder.xlsx';
     
        $objWriter = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
        $objWriter->save($newFile);
     
        echo 'Now, Backorder.xlsx is updating.';
    }
    EDIT : il me semble que ce soucis provient plus de la base de donnees (par la le INSERT), que du fait de vouloir modifier la cellule, non ? Ca expliquerait pourquoi je tourne en rond.

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans ton traitement d'insertion tu n'as pas du tout de conversion de la date donc c'est un peu normal non ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $data = PHPExcel_Style_NumberFormat::toFormattedString($data,'YYYY-MM-DD');
    j'ai le meme resultat.

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Montre nous le code sinon on ne peut pas comprendre d'ou sort ce $data.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    function updateBackorder($file) {
        require_once 'Classes/PHPExcel/IOFactory.php';
        $objet = PHPExcel_IOFactory::createReader('Excel2007');
        $excel = $objet->load($file);
        $sheet = $excel->getSheet(0);
     
        foreach ($sheet->getRowIterator() as $row) {
            foreach ($row->getCellIterator() as $cell) {
                $data = $cell->getValue();
                if (($cell->getColumn() == 'E' || $cell->getColumn() == 'G')) {
                     $data = PHPExcel_Style_NumberFormat::toFormattedString($data,'YYYY-MM-DD');
                }
                else {
                    if(PHPExcel_Shared_Date::isDateTime($cell)){
                         $data = PHPExcel_Style_NumberFormat::toFormattedString($data,'DD/MM/YY');
                    }
                    else {
                    }
                }
            }
        }
     
        deleteToTest('Backorder.xlsx');
        $newFile = 'Backorder.xlsx';
     
        $objWriter = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
        $objWriter->save($newFile);
     
        echo ('Now, Backorder.xlsx is updating.<br/>');
    }

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je me répète mais il n'y a pas besoin de réecrire le fichier.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Donc je dois creer un array stockant ce format de date et l'envoyant a la base de donnees ?

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Fais tes insertions ligne par ligne en même temps que tu parcoures le fichier Excel.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Super, cela fonctionne parfaitement !

    Merci beaucoup sabotage !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Modifier une cellule Excel depuis Access
    Par m0ul3sh0t dans le forum Access
    Réponses: 2
    Dernier message: 26/04/2010, 10h23
  2. Comment modifier le contenu d'une cellule excel avec C#
    Par roujij dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/08/2009, 14h18
  3. [VBA] Modifier des cellules excel en fonction de leur couleur
    Par Tententai dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/03/2007, 18h14
  4. [OLE] Modifier l'alignement de cellules Excel
    Par elsouljacker dans le forum Delphi
    Réponses: 3
    Dernier message: 16/05/2006, 11h44
  5. Réponses: 2
    Dernier message: 03/05/2006, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo