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

AJAX Discussion :

Export excel via Ajax


Sujet :

AJAX

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 32
    Points : 32
    Points
    32
    Par défaut Export excel via Ajax
    Je souhaite exporter des données dans un fichier Excel via Ajax.
    Les données à exporter sont dans un gros tableau d'objets javascript ( ma variable bigTabDataToExport) .

    Le problème :le navigateur ne me propose pas d'enregistrer le fichier Excel via mon Ajax lorsque l'appel Ajax lance la page "exportData.php" (pourtant il exécute bien la page...).

    Et si je lance directement ma page "exportData.php", il me demande tout de suite d'enregistrer le fichier excel sur mon disque... (Pour l'exemple, j'ai mis des données en dures mais le but étant de "remplir" le fichier excel avec les data de ma variable javascript)

    Donc comment se fait-il qu'en lançant mon Ajax, le navigateur ne me propose pas le téléchargement du fichier ? Il y a un truc qui m'échappe.

    Code HTML :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="javascript:;" onclick="exportData()"> EXPORTER </a>

    Code JavaScript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function exportData() {	
    	$.ajax({
    		type: "post",
    		url: "_exportData.php",
    		data: {
    			'task': 'Export',
    			'Data': bigTabDataToExport
    		}
    	}).success(function(data, text, jqxhr) { 
            }).fail(function(jqXHR, textStatus) { 
    	});		
    }
    et enfin le code de la page _exportData.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    	header("Content-type: application/vnd.ms-excel");
    	header("Content-disposition: attachment; filename=export.xls"); 
     
    	$test = '<table border="1" bordercolor="#ffffff">
    		<tr bgcolor="#ffd4ba"><td>COL 1</td><td>COL 2</td><td>COL 3</td><td>COL 4</td></tr>
    		<tr bgcolor="#ffffff"><td>COL 1a</td><td>COL 2a</td><td>COL 3a</td><td>COL 4a</td></tr>
    	</table>';
    	echo $test;
    ?>

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Si j'ai bien compris, tu as des données javascript qui doivent alimenter un fichier excel via php, puis proposer le fichier en téléchargement ?

    A priori, j'utiliserais ajax pour envoyer les données au serveur qui se chargera de construire le fichier excel qui sera enregistré dans une variable de session. Et au retour de la requête ajax tu fais un document.location vers _exportData.php qui se chargera de proposer le téléchargement de la variable de session correspondant au fichier excel.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Merci beaucoup de la réponse. Je ne suis pas sur d'avoir tout fait comme tu disais mais cela fonctionne.

    1/ je transmet mes données JavaScript à un fichier PHP via Ajax > _exportData.php
    2/ Ce fichier met en forme le contenu du futur fichier excel (avec les tr td... ) et met ce contenu dans une variable de session (merci pour cette astuce)
    3/ Au retour de l'Ajax, je fais donc location href (merci aussi de cette astuce) vers un deuxième fichier php > location.href = "_exportAlarmsBAA2.php"
    4/ Dans ce 2ème fichier, je récupère le contenu de la variable de Session et je fais un "echo" et HOP ca fonctionne !

    Je ne sais pas si c'est comme ca que tu voyais la solution, mais en tout cas, grâce à toi, ca marche, merci beaucoup !

    Pour ceux que cela intéresse, voici donc le code des différentes pages :

    PAGE JAVASCRIPT PAGE PRINCIPALE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function exportData() {	
    	$.ajax({
    		type: "post",
    		url: "_exportData.php",
    		data: {
    			'task': 'Export',
    			'Data': bigTabDataToExport
    		}
    	}).success(function(data, text, jqxhr) { 
                   location.href = "_exportAlarmsBAA2.php";
            }).fail(function(jqXHR, textStatus) { 
    	});		
    }
    PAGE _exportData.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    	session_start();
    	$test = '<table border="1" bordercolor="#ffffff">
    		<tr bgcolor="#ffd4ba"><td>COL 1</td><td>COL 2</td><td>COL 3</td><td>COL 4</td></tr>
    		<tr bgcolor="#ffffff"><td>COL 1a</td><td>COL 2a</td><td>COL 3a</td><td>COL 4a</td></tr>
    	</table>';
    	$_SESSION[tabExportExcel] = $test ;
            echo json_encode($test ); // utile juste pour voir le retour de l'ajax dans les traces
    ?>

    PAGE _exportData2.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?
    session_start();
     
    if (isset($_SESSION[tabExportExcel])){
    	$tabExportExcel = $_SESSION[tabExportExcel];
    	header("Content-type: application/vnd.ms-excel");
    	header("Content-disposition: attachment; filename=export.xls"); 
    	echo $tabExportExcel; 
    }
    ?>

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Ok, merci du retour, tu as bien compris le principe

    Juste dans "PAGE _exportData.php", plutôt que d'envoyer le tableau en retour (qui peut être lourd et s'il ne sert à rien...) autant retourner une variable qui confirmera ou non si le tableau excel à bien été construit. Sur le principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    session_start();
    $erreur_excel = 0;
     
    // Durant la construction de ton tableau tu fais $erreur_excel = 'mon message d\'erreur'; si un problème survient
     
    // Et pour finir
    echo json_encode(array('erreur_excel'=>$erreur_excel));
    et donc en retour ajax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    .success(function(data, text, jqxhr) { 
        if(data.erreur_excel == 0)
        {
            location.href = "_exportAlarmsBAA2.php";
        }
        else
        {
           alert(data.erreur_excel);
        }
    })

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Ah ok , merci pour l'astuce.

    Après, je mettais mon tableau html en retour uniquement pour la phase de dèv.
    Par la suite, je ne comptais pas faire "revenir" le tableau html, mais l'idée de tracé le bon fonctionnement de la création du tableau est une super idée.

    ------------------------

    Par contre je rencontre un autre soucis (je vais sans doute créer un nouveau message sur le forum d'ailleurs).

    Lors de mon appel AJAX, je "fais passer" un gros tableau de données (le fameux 'Data': bigTabDataToExport environ 260 entrées)
    Ce tableau que je récupère dans ma page _exportData.php semble pas complet (environ 20 entrées).

    Dans php ini, j'ai augmenté la taille de "post_max_size" pensant que c'était de là que provenait le problème mais rien ne change.

    Du coup, je comprends pas du tout d’où vient ma perte d'informations...

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Elle est crée comment cette variable bigTabDataToExport ? Peut-être sa structure ne correspond pas à ce que le paramètre data accepte. Regarde peut-être l'option "traditional" de la requête ajax pour transmettre un tableau ou des objets, ou du côté de $.param.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Alors ma variable "bigTabDataToExport" est un tableau d'objets, et certains de ces objets sont des objets d'objets.
    Ce qui m'étonne le plus dans le "problème" c'est que sur les 250 enregistrement du tableau, les 20 premiers passe parfaitement et cela fonctionne très bien.
    Par contre, les suivants... rien. En fait, ils n'arrivent même pas jusque "_exportData.php" ( un var_dump de mon post ajax me dit qu'il y a seulement un tableau de 20entrées. (au lieu des 250)

    Bref, selon toi, il s'agit plus d'un problème de formatage des données si je comprend bien ?
    Je vais tenter de re-construire mon "bigTabDataToExport " en tableaux de tableaux...

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    La variable que je passe en POST à mon Ajax est un tableau de tableaux.
    - Il y a 250 tableaux.
    - Pour chaque tableau, un tableau de 45 valeurs (que des INT ou VAR relativement court)

    Lorsque tout est complet, il ne "transmet" que 35 entrées/ 250 entrées
    Si je réduis le tableau de tableau à 20 valeurs, alors il transmet 50 entrée / 250 entrées

    Il y a donc visiblement un problème de taille sur une variable quelque part... une idée, une piste ?

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    RE

    Bon, j'ai finis par trouver (avec de l'aide :p )
    C'était un problème avec la variable "max_input_vars"
    Elle était calibrée à 1000, et j'étais, dans mon cas, bien au delà.

    En tout cas, merci pour ta participation.
    Cdlt
    David

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Alors c'est juste un problème côté serveur ? Tu as trouvé une solution autre que d'augmenter "max_input_vars" ? Ton lien est mort

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

Discussions similaires

  1. Export Excel via un code pour SAS Guide
    Par Pierre-Henri ROBLOT dans le forum SAS Base
    Réponses: 2
    Dernier message: 28/01/2015, 11h07
  2. [EG] EXPORT EXCEL via un code pour SAS Guide
    Par Pierre-Henri ROBLOT dans le forum Outils BI
    Réponses: 8
    Dernier message: 31/07/2014, 14h58
  3. Variable dans le titre d'un export excel via module
    Par Angad dans le forum QlikView
    Réponses: 5
    Dernier message: 05/07/2014, 21h33
  4. Réponses: 7
    Dernier message: 16/06/2014, 15h29

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