Pages :
Hello,

quel est la manière la plus courante pour créer un fichier excel, du genre si l'utilisateur appuis sur un bouton export, que cela exporte donc le contenue d'une <table> html vers un fichier xls.

Merci de vos réponse
Modifié par JENCAL (24 Jul 2015 - 15:31)
Ok

en deux lignes en jquery c'est fait :

			$(document).ready(function() {
				$('#export').click( function() { // Au clic sur un élément
					window.open('data:application/vnd.ms-excel,' + escape($('#id_table_result').html()));
					e.preventDefault();
				});
			})


par contre je suis pas fan, on a aucun contrôle sur le fichier de sortie.. j'arrive pas à lui donner un nom, j'arrive pas à laisser les bordures d'excel (oui quand j'ouvre le fichier télécharger, aucune bordure, tout blanc....)
Modérateur
Salut Jencal, Smiley smile


Mis à part les cookies, le JS et par conséquent Jquery ne peut pas créer un fichier. Tu dois passer par un langage serveur.

Le plus courant est d'utiliser le CSV. Ce type d'export permet de renvoyer dans un fichier "texte", toutes les données d'une table par exemple.

Si ce sont de véritables feuilles de calcul que tu dois exporter, il n'y a pas beaucoup de solutions :

Tu as en natif l'objet COM de php. Le gros avantages de cet objet, est que tu peux exporter des données vers Word, Excel, etc. L'inconvénient est que ce n'est pas simple. Il me semble que le VB sera a aborder.

Dans les autres langages tel que le Python par exemple, je suis pratiquement sûr qu'il y ait plus de solutions et facilité. Il y a un bon exemple ici : http://www.portailsig.org/content/python-lire-et-ecrire-des-fichiers-microsoft-excel-application-quantum-gis

Avec Pear, il y a une librairie à ce sujet. Cependant, elle n'est plus maintenue. Je pense tout de même qu'elle doit fonctionner. A voir et à essayer au cas où.

Sinon, je garde le meilleur pour la fin ou la faim (oui oui je suis sadique, je garde le suspens). Pour php, il y a phpExcel. Il y a de la bonne doc un peu partout. Il me semble qu'il y a un bon tuto sur Developpez.com. Fait une petite recherche à ce sujet. De mémoire, c'est pas sorcier. Cet hiver, il me semble que j'avais utilisé cette librairie pour aider un collègue de boulot. Lui aussi, il pensait que le JS créait à la voler des fichiers excel. De mémoire, il avait essayer avec jquery dataTable.
Super réponse !

Python, Pearl et VB, je peux oublier Smiley smile mais je garde tes conseils en tête

Par contre PhpExcel est très intéressant, je pense partir de ce coté là !

Il faudrait que j'envoie ma <table> en ajax, et le construire avec php, pour l'enregistrer.


P.S :

Je me suis sans doute mal exprimer, mais le fichier excel doit être créer COTER CLIENT, sur le poste de l'utilisateur hein.
Et le but final c'est quoi Jencal ? Je pige pas trop le concept ?

Peux tu expliquer la finalité ?

Merci, et bosse bien.

Smiley smile
Ouép,

Rien de compliquer, en faite j'ai un tableau avec des données, quand je dis un tableau, je parle d'une <table> HTML. Les utilisateurs veulent avoir la possibilité d'exporter ce tableau dans un fichier excel pour pouvoir le traiter par la suite plus facilement.
Modifié par JENCAL (22 Jul 2015 - 11:57)
CVS a écrit :
ah ok, merci de l'explication. J'ai vue tes tutos sur la toile ...


Quels tutos ?
Modifié par JENCAL (22 Jul 2015 - 11:59)
Administrateur
Bonjour,

aucun rapport avec ta question (fichier Excel) mais si tu veux un genre d'Excel / tableur dans ton navigateur, il existe handsontable. Utilisé de façon industrielle par mon client, c'est assez impressionnant (le poids du script non compressé autant que les fonctionnalités ou la vitesse)
Modérateur
JENCAL a écrit :


Il faudrait que j'envoie ma &lt;table&gt; en ajax, et le construire avec php, pour l'enregistrer.


P.S :

Je me suis sans doute mal exprimer, mais le fichier excel doit être créer COTER CLIENT, sur le poste de l'utilisateur hein.


Comme je t'ai dit, le JS (côté client) ne peut pas créer un fichier pour Mme Michu. Par contre, tu peux faire de l'ajax et demander au serveur de créer ce fichier. Ensuite en retour tu envoies le header adéquate afin que le fichier soit proposé en téléchargement ("ouvrir" ou "enregistrer sous").

@Felipe : Merci pour le partage Smiley smile
merci pour vos réponse,

mdr les trois bières !

j'ai trouver un script, qui marche parfaitement et qui fonctionne et celui ci permet de télécharger un fichier excel avec comme contenue la <table> html choisi !

    <script type="text/javascript">
        var tableToExcel = (function () {
            var uri = 'data:application/vnd.ms-excel;base64,'
                , template = '<html xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:x="urn:schemas-microsoft-com:office:excel"xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><!--[endif]--></head><body><table>{table}</table></body></html>'
                , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
                , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
                return function (table, name) {
                if (!table.nodeType) table = document.getElementById(table)
                var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }
                window.location.href = uri + base64(format(template, ctx))
            }
        })()
    </script> 


Je vais être franc, je n'ai même pas mis les mains dans le script, j'ai copié coller, (ce qui est rare).

Cependant, Felipe, je vais tester ce que tu me conseil, par curiosité !
Merci
Modérateur
Au temps pour moi. Si ça fonctionne c'est super !

Peux tu nous expliquer un peu la marche à suivre stp ? chez moi, ça ne fonctionne pas. Je ne vois pas d'erreur en console et j'ai testé sur Chromium & FF. Environnement Sled.
Modifié par niuxe (23 Jul 2015 - 23:04)
J'ai mon tableau construit de cette manière

           <table id="id_table" class="table">
                <thead>
                    <tr>
                    </tr>
                </thead>
                <tbody class="totals">
                </tbody>
            </table>


le tbody se rempli à la volé, suivant la recherche utilisateur

Sur un bouton j'ai un onclik

<button type="button" tabindex="6" id="export" onclick="tableToExcel('id_table', 'Tableau Excel')" class="btn btn-primary reset-selection">Export .xls&nbsp;&nbsp;<i class="fa fa-cog fa-fw"></i></button>


Et le script js

    <script type="text/javascript">
        var tableToExcel = (function () {
            var uri = 'data:application/vnd.ms-excel;base64,'
                , template = '<html xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:x="urn:schemas-microsoft-com:office:excel"xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><!--[endif]--></head><body><table>{table}</table></body></html>'
                , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
                , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
                return function (table, name) {
                if (!table.nodeType) table = document.getElementById(table)
                var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }
                window.location.href = uri + base64(format(template, ctx))
            }
        })()
    </script> 


le tout dans la même page

lorsque je clic sur le bouton j'ai un fichier "telechargement.xls" qui s'enregistre automatiquement avec mes données à l'intérieur.
Modifié par JENCAL (24 Jul 2015 - 10:15)
Modérateur
Un grand merci pour ce partage. Smiley smile

Je viens de tester et ça fonctionne assez bien. Par contre, il a fallu que je mette l'extension xls. Là je suis au taf et donc sur Vindo. Aussi, sur l'ordi j'ai Libre office et non pas ms office. Le temps de chargement du fichier était un peu long pour juste 2 cellules.


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <table id="id_table" class="table">
                <thead>
                    <tr>
                    <th>bla</th>
                    <th>ble</th>
                    </tr>
                </thead>
                <tbody class="totals">
                <td>bali</td>
                <td>balo</td>
                </tbody>
            </table>
            
            <button type="button" tabindex="6" id="export" onclick="tableToExcel('id_table', 'Tableau Excel')" class="btn btn-primary reset-selection">Export .xls&nbsp;&nbsp;<i class="fa fa-cog fa-fw"></i></button>
            
        <script type="text/javascript">
        var tableToExcel = (function () {
            var uri = 'data:application/vnd.ms-excel;base64,'
                , template = '<html xmlns:o="urn:schemas-microsoft-com:office:office"xmlns:x="urn:schemas-microsoft-com:office:excel"xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><!--[endif]--></head><body><table>{table}</table></body></html>'
                , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
                , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
                return function (table, name) {
                if (!table.nodeType) table = document.getElementById(table)
                var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }
                window.location.href = uri + base64(format(template, ctx))
            }
        })()
    </script> 
</body>
</html>
Perso j'ai ms office c'est surment pour ça que j'ai pas besoin d'ajouter l'extension, elle est automatique.

Par contre le temps de chargement il est quasi instante chez moi et j'ai :

16 lignes de la lettre A à O donc une centaine de cellules. le fichier en sortie fait 5 Ko
EDIT :

j'ai résolu du coup mon problème, merci de vos conseils ! Smiley loveu
Modifié par JENCAL (24 Jul 2015 - 15:31)
Par contre j'arrive pas à lui donner un autre "name" que "telechargement.xls" j'aimerais l'appelé autrement le fichier... mais j'arrive pas du tout.. Smiley boulet
Je me répond tout seul

Il faut passer par un lien caché :

voici le nouveau script


trois nouvelles lignes :

                  document.getElementById("dlink").href = uri + base64(format(template, ctx));
                  document.getElementById("dlink").download = filename;
                  document.getElementById("dlink").click();


celles ci remplace
window.location.href = uri + base64(format(template, ctx))


et le fameux lien caché
 <a id="dlink"  style="display:none;"></a>

Modifié par JENCAL (24 Jul 2015 - 16:42)
Pages :