Datatables / TableTools: format de données en tant que texte lors de l'exportation vers Excel

J'utilise le plugin Datatables TableTools pour fournir une option Export to Excel pour une table sur ma page.

En général, tout fonctionne comme prévu. Mon seul problème est que j'aurais besoin de toutes les données ou. Les colonnes de la table Excel résultante étant formatées en tant que texte, sinon je perds des données dans certaines colonnes.

Exemples: – J'ai une colonne avec des zéros principaux (p. Ex. 0022 ) qui n'apparaît que lorsque les zéros avancés sont coupés (p. Ex. 22 ) dans le fichier Excel si ceux-ci ne sont pas formatés en tant que texte. – Une autre colonne contient des numéros de compte à 19 chiffres (p. Ex., 1234567890123456789 ), qui apparaît avec les quatre derniers chiffres en zéros (p. Ex. 1234567890123450000 ) dans le fichier Excel si ceux-ci ne sont pas formatés en tant que texte.

Est-ce que je peux définir cette option dans mon initialisation Datatables / TableTools de sorte qu'elle n'exporte toujours toutes les données sous forme de texte dans le fichier Excel?

Merci beaucoup pour toute aide, Tim.

TableTools ne crée pas de fichier excel réel , il crée un fichier csv la place. Ceux-ci contiennent uniquement des données brutes, pas de formatage. Bien que les zéros avancés soient là, Excel ne les montrera généralement pas. Vous avez plusieurs options ici:

  • Modifiez le formatage à partir d'Excel
  • Ouvrez le fichier csv à partir de la boîte de dialogue ouverte d'Excel, à partir de laquelle vous devriez pouvoir marquer les colonnes en tant que texte (vous devrez peut-être modifier le type de fichier sur txt )
  • Ajouter des devis autour des données
  • Créez un véritable fichier Excel via une bibliothèque externe

J'ai essayé la première option donnée par Aureltime mais j'ai trouvé un petit effet secondaire. Si la colonne ne contient que des nombres et que vous utilisez la fonction de rendu, l'option de tri ne fonctionne pas. J'espère que, à partir de la version datée de 1.10.12, il existe une nouvelle option pour personnaliser les données avant de créer le fichier excel.

Dans cette fonction de personnalisation, j'ai ajouté le / u002C et cela fonctionne parfaitement, même le tri des nombres.

  "buttons": [{ extend: 'excel', exportOptions: { orthogonal: 'sort' }, customizeData: function ( data ) { for (var i=0; i<data.body.length; i++){ for (var j=0; j<data.body[i].length; j++ ){ data.body[i][j] = '\u200C' + data.body[i][j]; } } } }], 

J'ai la solution à ce problème.

Il a été cassé ma tête beaucoup de temps … Donc, l'explication est en dessous de ceci:

  1. Il corrige fonctionne bien dans DatatableJS version 1.10.11 (pour l'option d'exportation HTML Excel)
  2. Ouvrez datatables.js et recherchez ceci: "DataTable.ext.buttons.excelHtml5 = {"
  3. Recherchez dans les lignes suivantes jusqu'à ce que ce code soit pris en compte et commentez-le:

      cells.push( typeof row[i] === 'number' || (row[i].match && $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) && row[i].charAt(0) !== '0') ? '<ct="n"><v>'+row[i]+'</v></c>' : '<ct="inlineStr"><is><t>'+( ! row[i].replace ? row[i] : row[i] .replace(/&(?!amp;)/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''))+ // remove control characters '</t></is></c>' // they are not valid in XML ); 
  4. Mettez ce nouveau code:

      cells.push( '<ct="inlineStr"><is><t>'+( ! row[i].replace ? row[i] : row[i] .replace(/&(?!amp;)/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''))+ // remove control characters '</t></is></c>' // they are not valid in XML ); 
  5. Enregistrez vos datatables.js

  6. Profitez de vos sages cellules de texte pour toujours !!

Cette solution permet de maintenir le nombre, la date et le format décimal.

J'ai changé le code pour forcer à écrire au format texte toutes les valeurs du HTML au XLSX.

Si quelqu'un a une question à propos de cette solution, je vais essayer de répondre à toutes les questions.

Merci à tous.

J'aimerais élargir la réponse Richards. Comme Richard, je ne pouvais pas trouver la solution basée sur la documentation de Datatables. Je voulais une exportation excelHtml5 avec tous les champs exportés uniquement en texte.
La solution Richards m'a aidé à trouver la solution que je vais publier ci-dessous.

Pour Datatables 1.10.12, le code des boutons html5 apparaît dans un fichier séparé buttons.html5.js.

Comme Richard a noté, recherchez le bloc DataTable.ext.buttons.excelHtml5.

Le code de ce qui m'a intéressé était:

 // Detect numbers - don't match numbers with leading zeros or a negative // anywhere but the start if ( typeof row[i] === 'number' || ( row[i].match && $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) && ! $.trim(row[i]).match(/^0\d+/) ) ) { cell = _createNode( rels, 'c', { attr: { t: 'n', r: cellId }, children: [ _createNode( rels, 'v', { text: row[i] } ) ] } ); } else { // Replace non standard characters for text output var text = ! row[i].replace ? row[i] : row[i] .replace(/&(?!amp;)/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''); cell = _createNode( rels, 'c', { attr: { t: 'inlineStr', r: cellId }, children:{ row: _createNode( rels, 'is', { children: { row: _createNode( rels, 't', { text: text } ) } } ) } } ); } 

Pour que le bouton excelHtml5 expédie UNiquement texte, j'ai supprimé le bloc IF qui identifiait un champ comme un nombre potentiel. Notre client a également eu une demande spécifique pour avoir '<>' dans n'importe quel champ vide, donc j'ai supprimé les deux méthodes de remplacement pour <et>.

 // Replace non standard characters for text output var text = ! row[i].replace ? row[i] : row[i] .replace(/&(?!amp;)/g, '&amp;') .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''); cell = _createNode( rels, 'c', { attr: { t: 'inlineStr', r: cellId }, children:{ row: _createNode( rels, 'is', { children: { row: _createNode( rels, 't', { text: text } ) } } ) } } ); 

Cette modification permet au bouton excel d'exporter toutes les valeurs en tant que texte. Excel ne change plus mes <et> et mes numéros sont tous des textes, aucune notation scientifique.

Mettre à jour :

À partir des données 1.10.8 et introduction de Button API, tabletools est obsolète et voici la façon de le faire via les boutons API:

Démonstration ici

Il étend le bouton excel avec le paramètre exportOptions qui permet quelques options, l'une est orthogonale lorsque vous pouvez dire qu'elle devrait utiliser le type 'sort':

 exportOptions: { orthogonal: 'sort' } 

Après avoir besoin de préciser le type de tri et les colonnes qui devraient être affectées par l'option colonneDefs datating:

 columnDefs: [{ targets:[1], render: function(data, type, row, meta){ if(type === 'sort'){ //data = ' ' + data ; return "\u200C" + data ; } return data ; } }] 

Ici, la deuxième colonne (zéro indexée) est considérée. Pour le type 'sort', nous préfixons la date avec ZERO WIDTH NON-JOINER pour que l'excellence le considère comme une chaîne. N'a pas remarqué d'effets secondaires.

Prendre plaisir

Il existe un moyen de le faire via le plugin tabletools de données.

En utilisant Arrêter Excel de convertir automatiquement certaines valeurs de texte en dates ,

Et l'option du bouton fncellrender , la solution consiste à utiliser l'option fnCellRender sur le bouton xls comme ceci:

 { "sExtends": "xls", "fnCellRender": function ( sValue, iColumn, nTr,iDataIndex ) { if ( iColumn === colIndexOfString ) { return '"=""' + sValue + '"""' ; } return sValue; } } 

De cette façon, les données sont extraites dans le fichier csv avec les caractères spéciaux nécessaires pour que Excel les considère comme des chaînes et éviter d'utiliser la détection de type automatique.

Et oui, maintenant, vous pouvez garder vos zéros avant et arrière

Solution de l'indice CSV expari avec des caractères spéciaux. Trouvez charset à partir de https://cdn.datatables.net/buttons/1.1.2/js/buttons.html5.js ou https://cdn.datatables.net/buttons/1.1.2/js/buttons.html5.min .js

Et changez-le en UTF-8-BOM de UTF-8

Ce problème spécifique a été répondu avec élégance dans cette publication – https://stackoverflow.com/a/165052/6169225 . Disons que vous avez un entier your_integer que vous souhaitez afficher en tant que chaîne (c.-à-d. Les zéros avancés affichés). Ensuite, il suffit de le formater comme tel avant d'exporter vers excel – ="<your_integer>" . Lorsque les téléchargements automatiques de excel doc, votre nombre entier s'affiche en tant que chaîne à l'aide de cette méthode.