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 : fichier généré impossible à ouvrir avec Excel


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut PHPExcel : fichier généré impossible à ouvrir avec Excel
    Bonjour,

    je dois générer un fichier .xls (pas de .xlsx), qui sera potentiellement ouvert avec des versions "récentes" d'Excel (2013 ou plus récent) sur un serveur dont l'encodage est latin1.
    Le fichier est écrit (pas envoyé au navigateur), donc pas à manipuler les headers.

    J'utilise donc PHPExcel, j'ai suivi http://g-ernaelsten.developpez.com/tutoriels/excel2007, j'ai essayé PHPExcel_Writer_Excel5 (pour .xls) et PHPExcel_Writer_Excel2007 (en me disant que pour des versions récentes d'Excel ce serait mieux).
    Le fichier se génère bien mais impossible de l'ouvrir "correctement" sous Excel.
    J'obtiens une erreur du genre "Le format et l'extension du fichier xxxx ne correspondent pas. Le fichier peut présenter un risque ou avoir été endommagé."
    Et il me propose de l'ouvrir quand même, ce que je fais et cela fonctionne bien.
    Je n'ai aucun souci avec LibreOffice.

    J'ai essayé toutes les solutions trouvées un peu partout ici ou sur stack... mais pas moyen d'ouvrir ce fichier.
    J'ai essayé de changer l'encodage, j'ai enlevé tous les caractères spéciaux, rien n'y fait...
    J'ai essayé (en désespoir de cause) de faire un xlsx (tout en sachant que ce n'est pas le format attendu) et ça ne fonctionne pas mieux (erreur du genre "impossible d'ouvrir le fichier").

    je ne sais plus quoi faire, avez-vous une idée ?

    merci d'avance !

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Salut,
    On peut voir la création et l'envoi du fichier ?

  3. #3
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    $dir = $racine."/temp";
    		$chemin_complet = $dir."/".$argFile;
     
     
    		$ligne_de_debut_de_traitement_du_tableau = 0;
    		$nombre_de_ligne_dans_fichier = 0;
     
     
    		// ***** Créer un nouveau fichier Excel
    		$objPHPExcel = new PHPExcel();
     
     
    		if($argDepartDonnees > 0 && $argDepartDonnees != "")
    			$premiere_ligne_ecrite = $nombre_de_ligne_dans_fichier;
    		else 
    			$premiere_ligne_ecrite = 0;		
     
    		$nb_ligne_a_ecrire = sizeof($argArray);
     
    		// nom de la feuille
    		$objPHPExcel->getActiveSheet()->setTitle($argNomFeuille);
     
     
    		//Pour chaque ligne
    		$nombre_ligne_ecrite = 0;
    		for($i = $ligne_de_debut_de_traitement_du_tableau; $i < $nb_ligne_a_ecrire; $i++)
    		{
    			$nombre_de_colonne_a_ecrire = sizeof($argArray[$i]);
    			//Pour chaque colonne
    			for($j = 0; $j < $nombre_de_colonne_a_ecrire; $j++)
    			{				
     
    				$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($j, $nombre_ligne_ecrite+$premiere_ligne_ecrite+1, $argArray[$i][$j]);
    			}		
     
    			$nombre_ligne_ecrite++;
     
    		}
     
    		// $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    		$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
     
    		unlink($dir."/".$argFile);
     
     
    		ob_end_clean();
    		ob_start();
    		$objWriter->save($dir."/".$argFile);
    ça c'est pour la création, actuellement il n'y pas d'envoi, ça créé juste le fichier sur le serveur et je vais l'y chercher pour voir
    à terme, le fichier sera envoyé par FTP

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Il y a quoi dans ?

  5. #5
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut
    $argFile contient le nom du fichier cible (sans aucun caractère spécial) (xxx.xls)

    j'ai fait quelques tests et le résultat est déroutant (mais je pense que le problème vient bien de l'encodage) :
    si je ne mets que la ligne d'en-tête (sans caractère spécial), le fichier généré s'ouvre sans souci
    si j'ajoute les lignes "utiles", ça ne s'ouvre plus

    du coup, quel est l'encodage que je dois utiliser ?
    il y a une colonne qui contient une adresse email, je dois donc pouvoir insérer un @ dans mon fichier
    et si je dois changer d'encodage, quelle méthode dois-je utiliser de préférence ?

    j'avais lu qu'Excel ne supportait pas l'UTF8 (mais le post datait de 2012 il me semble, ça a donc pu changer)

    merci !

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Perso, je fais tout en UTF-8 et je n'ai pas vraiment de souci.
    Maintenant tout doit-être ne UTF-8 méme le fichier qui contient le code PHP.
    Et si on ressort des données de DB en Latin, alors in utiliseras les fonctions utf8_encode et utf8_decode.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 312
    Par défaut
    Citation Envoyé par Elianora la blanche Voir le message
    "Le format et l'extension du fichier xxxx ne correspondent pas. Le fichier peut présenter un risque ou avoir été endommagé."
    Bonjour,

    Cela vient généralement du fait que le format est celui du xlsx alors que l'extension est xls. Vous pouvez vérifier qu'en changeant l'extension du fichier xls en xlsx vous n'avez plus d'erreur.

  8. #8
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut
    non, si je génère volontairement du xlsx (avec ces mêmes données) ou que je modifie manuellement l'extension, c'est pire : j'ai une erreur qui dit "Impossible d'ouvrir le fichier 'xxx' car son format ou son extension n'est pas valide. Vérifiez que le fichier n'est pas endommagé et que son extension correspond bien au format du fichier." et pas moyen de l'ouvrir quand même...

    et à quoi bon utiliser Excel5 si ça me génère du xlsx alors que je n'en veux pas ? ^^

  9. #9
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut
    juste pour voir, j'ai essayé de faire ouvrir le fichier directement (plutôt que l'écrire)
    ça me propose bien l'ouverture de fichier mais index.php et donc mon éditeur de texte sélectionné par défaut...
    le détail indique néanmoins "feuille de calcul Excel 1997-2003"

    c'est normal ?
    ce n'est de toute façon pas ce que je veux faire mais est-ce que ça ne "prouverait" pas que mon fichier n'est pas reconnu comme ce qu'il est ?

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Fais enregistrer sous et donne lui un nom correcte, sinon dans ce cas il faut envoyer les entêtes.

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Si jamais, je viens de tester ton code (sans donnée) et je n'ai aucune erreur avec la dernière version de PhpExcel :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    <?php
    /**
     * PHP versions 5.6
     * @Copyright Formatux.be.
     * @Author: G² <info@formatux.be>
     * Date: 1/08/16
     * Description :
     *
     */
    ini_set('date.timezone','Europe/Brussels');
    require 'vendor/autoload.php';
     
    $dir = $racine . "temp";
    $chemin_complet = 'test.xls';
     
    $argArray = [0,1];
     
     
    $ligne_de_debut_de_traitement_du_tableau = 0;
    $nombre_de_ligne_dans_fichier = 0;
     
     
    // ***** Créer un nouveau fichier Excel
    $objPHPExcel = new PHPExcel();
     
     
    if ($argDepartDonnees > 0 && $argDepartDonnees != "")
        $premiere_ligne_ecrite = $nombre_de_ligne_dans_fichier;
    else
        $premiere_ligne_ecrite = 0;
     
    $nb_ligne_a_ecrire = sizeof($argArray);
     
    // nom de la feuille
    $objPHPExcel->getActiveSheet()->setTitle('Carambar');
     
     
    //Pour chaque ligne
    $nombre_ligne_ecrite = 0;
    for ($i = $ligne_de_debut_de_traitement_du_tableau; $i < $nb_ligne_a_ecrire; $i++) {
        $nombre_de_colonne_a_ecrire = sizeof($argArray[$i]);
        //Pour chaque colonne
        for ($j = 0; $j < $nombre_de_colonne_a_ecrire; $j++) {
     
            $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($j, $nombre_ligne_ecrite + $premiere_ligne_ecrite + 1, $argArray[$i][$j]);
        }
     
        $nombre_ligne_ecrite++;
     
    }
     
    // $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
     
     
     
     
    ob_end_clean();
    ob_start();
    $objWriter->save($chemin_complet);

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

Discussions similaires

  1. [vba excel & access] ouvrir feuille excel avec access
    Par ash_rmy dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/09/2006, 09h59
  2. ouvrir doc excel avec CheckBox
    Par jcl dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/07/2006, 20h43
  3. [VB6] Commande pour ouvrir un TXT avec Excel
    Par quaife dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 29/05/2006, 19h06
  4. comment ouvrir un fichier XML avec excel
    Par ALCINA dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 24/03/2006, 15h42
  5. [C#] [EXCEL] Travailler avec EXCEL sans ouvrir le logiciel
    Par Fabsou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/07/2004, 11h29

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