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

JavaScript Discussion :

Exporter un tableau HTML paginé en CSV


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Exporter un tableau HTML paginé en CSV
    Hello world,

    Je me tourne vers vous car je n'arrive décidément pas à exporter en entier un tableau HTML paginé. Je précise que j'utilise CakePHP 3.0 et c'est lui qui gère la pagination.

    code javascript

    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
     
    function exportTableToCSV($table, filename) {
    		var $headers = $table.find('tr:has(th)')
    		,$rows = $table.find('tr:has(td)')
    		// Temporary delimiter characters unlikely to be typed by keyboard
    		// This is to avoid accidentally splitting the actual contents
    		,tmpColDelim = String.fromCharCode(11) // vertical tab character
    		,tmpRowDelim = String.fromCharCode(0) // null character
    		// actual delimiter characters for CSV format
    		,colDelim = '","'
    		,rowDelim = '"\r\n"';
    		// Grab text from table into CSV formatted string
    		var csv = '"';
    		csv += formatRows($headers.map(grabRow));
    		csv += rowDelim;
    		csv += formatRows($rows.map(grabRow)) + '"';
    		// Data URI
    		var csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv);
    		$(this)
    		.attr({
    		'download': filename
    		,'href': csvData
    		//,'target' : '_blank' //if you want it to open in a new window
    		});
    		//------------------------------------------------------------
    		// Helper Functions
    		//------------------------------------------------------------
    		// Format the output so it has the appropriate delimiters
    			function formatRows(rows){
    				return rows.get().join(tmpRowDelim)
    				.split(tmpRowDelim).join(rowDelim)
    				.split(tmpColDelim).join(colDelim);
    			}
    		// Grab and format a row from the table
    			function grabRow(i,row){
    				var $row = $(row);
    				//for some reason $cols = $row.find('td') || $row.find('th') won't work...
    				var $cols = $row.find('td');
    				if(!$cols.length) $cols = $row.find('th');
    				return $cols.map(grabCol)
    				.get().join(tmpColDelim);
    			}
    		// Grab and format a column from the table
    			function grabCol(j,col){
    				var $col = $(col),
    				$text = $col.text();
    				return $text.replace('"', '""'); // escape double quotes
    			}
    	}
    	// This must be a hyperlink
    	$("#export").click(function (event) {
    		// on recupere la date d'aujourd'hui
    		var date = new Date();
    		// var outputFile = 'export'
    		var outputFile = 'export';
    		outputFile = outputFile.replace('.csv','') + '.csv'
    		// CSV
    		exportTableToCSV.apply(this, [$('#resConservation>table'), outputFile]);
    		// IF CSV, don't do event.preventDefault() or return false
    		// We actually need this to be a typical hyperlink
    	});
    Code PHP
    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
     
    <div class="conservations index large-10 medium-9 columns" id="resConservation" >
        <table id="tabResConservation" cellpadding="0" cellspacing="0">
     
            <tr>
                <th><?= $this->Paginator->sort('Préfixe') ?></th>
                <th><?= $this->Paginator->sort('Numéro de boîte') ?></th>
                <th><?= $this->Paginator->sort('Type de conservation') ?></th>
                <th><?= $this->Paginator->sort('Date de création') ?></th>
                <th><?= $this->Paginator->sort('Date de modification') ?></th>
                <th><?= $this->Paginator->sort('Généralités') ?></th>
                <th><?= $this->Paginator->sort('Remarques') ?></th>
                <th><?= $this->Paginator->sort('ID') ?></th>
                <th class="actions"><?= __('Actions') ?></th>
            </tr>
     
        </table>
        <div class="paginator">
            <ul class="pagination">
                <?= $this->Paginator->prev('< ' . __('previous')) ?>
                <?= $this->Paginator->numbers() ?>
                <?= $this->Paginator->next(__('next') . ' >') ?>
            </ul>
            <p><?= $this->Paginator->counter() ?></p>
        </div>
    </div>
     
    <div class='button'>
    	<a href="#" id ="export" role='button'>CSV</a>
    </div> 
     
    <?php include('csv.ctp'); ?>
     
    <script>
    	var tab = <?php echo json_encode($conservations); ?>;
    	var idElementTableau = document.getElementById('tabResConservation');
    	var newRow;
     
    	for (var i=0 ; i<tab.length ; i++){
    		newRow = idElementTableau.insertRow(-1);
    		for (var j=0 ; j<8 ; j++){
    			eval("var newCell" + j + "=newRow.insertCell(j);");
    		}
    		newCell0.innerHTML = tab[i]['dico_prefix_conserv']['name'];
    		newCell1.innerHTML = tab[i]['numero_boite'];
    		newCell2.innerHTML = tab[i]['dico_type_conserv']['name'];
    		newCell3.innerHTML = "NC";
    		newCell4.innerHTML = "NC";
    		newCell5.innerHTML = tab[i]['generalites'];
    		newCell6.innerHTML = tab[i]['remarques'];
    		newCell7.innerHTML = tab[i]['id'];
    	} 
    </script>
    Le code marche mais je n'arrive qu'à exporter la page courante affichée ... Pouvez-vous m'aider pour exporter TOUT le tableau ?
    Je suis ouvert à toute proposition même si elle implique une méthode différente.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    apparemment le code PHP ne génère qu'une page et donc le code JavaScript n'a accès qu'à cette page
    pour exporter tout le contenu, essaye peut-être d'enlever la pagination en PHP pour tout afficher

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup pour ta réponse Jar Jar Binks . Cependant je souhaiterais tout de même garder la pagination sur la page, car le tableau affiché contient plus de 20 000 lignes.

    Tu ne connaîtrais pas une solution ? Enfin est-ce seulement faisable ?

  4. #4
    Membre habitué Avatar de lalouve
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 128
    Points : 145
    Points
    145
    Par défaut
    Le plus simple est d'écrire un script PHP qui génère le fichier CSV et de l'appeler dans le href de ton lien #export.
    Avec les bons header(), le fichier se téléchargera directement en cliquant sur le lien sans changer de page.
    if (navigator.geolocation) { //do your magic }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Merci lalouve !

    Du coup si j'ai bien compris, je créé une vue spéciale pour l'élaboration du csv et son téléchargement. Je passe à cette vue le tableau en entier (et non partiel à cause du paginate) par le biais du contrôleur. Cette vue sera alors appellée dans le href. C'est bien ça ?

    Je ne vais pouvoir tester que lundi, donc je vous tiens au courant dans tous les cas !

    Ps: Je ne sais pas si tu connais cakePHP mais au cas où tu te demande pourquoi je parle de vues et de contrôleurs c'est parce que c'est un framework qui utilise le modèle MVC

  6. #6
    Membre habitué Avatar de lalouve
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 128
    Points : 145
    Points
    145
    Par défaut
    Oui, c'est bien de cela dont il s'agit (en fait, il faudrait à présent plutôt en discuter sur le forum PHP que JavaScript).

    La vue à laquelle tu transmets le tableau est super basique, sans layout (cf. format CSV).

    Regarde du coté des headers HTTP suivants pour le téléchargement :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    header('Content-Type: application/csv');
    header('Content-Disposition: attachment; filename="export.csv"');
    header('Content-transfer-encoding: 8bit');
    if (navigator.geolocation) { //do your magic }

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    D'accord, j'essaie ça lundi et si jamais j'ai un souci je posterai sur le forum PHP

    Je mets le post en résolu du coup. Merci encore pour ton aide !!

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

Discussions similaires

  1. [Excel] Exporter un tableau PHP vers CSV ou XLS
    Par mariafan dans le forum Bibliothèques et frameworks
    Réponses: 20
    Dernier message: 28/10/2011, 11h53
  2. Importation tableau html dans fichier .csv ou excel
    Par ritavsky dans le forum VB.NET
    Réponses: 4
    Dernier message: 31/05/2010, 11h04
  3. [CSV] Conversion d'un tableau html en un fichier csv
    Par MnzNezo dans le forum Langage
    Réponses: 5
    Dernier message: 11/07/2007, 15h53
  4. [RegEx] Exporter un tableau HTML en XML/XLS
    Par wishmastah dans le forum Langage
    Réponses: 1
    Dernier message: 15/05/2006, 13h41
  5. tableau HTML vers CSV
    Par obelix dans le forum Langage
    Réponses: 6
    Dernier message: 09/11/2005, 23h51

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