tabla exportar con buttons botones bootstrap jquery html csv export export-to-csv

jquery - exportar - html datatable export to excel



Exportar a CSV usando jQuery y html (6)

Tengo una información tabular que necesito exportar a csv sin usar ningún plugin externo o api. window.open método window.open para pasar los tipos mime pero tuve problemas como los siguientes:

Cómo determinar si Microsoft Excel u Open Office están instalados en el sistema usando jquery

El código debe ser independiente del hecho de que lo que se está instalando en el sistema es decir, openoffice o ms excel. Creo que CSV es el formato que se espera que se muestre en ambos editores.

CÓDIGO

<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script type="text/JavaScript"> $(document).ready(function(){ $("#btnExport").click(function(e) { var msg = GetMimeTypes(); //OpenOffice window.open(''data:application/vnd.oasis.opendocument.spreadsheet,'' + $(''#dvData'').html()); //MS-Excel window.open(''data:application/vnd.ms-excel,'' + $(''#dvData'').html()); //CSV window.open(''data:application/csv,charset=utf-8,'' + $(''#dvData'').html()); e.preventDefault(); }); }); function GetMimeTypes () { var message = ""; // Internet Explorer supports the mimeTypes collection, but it is always empty if (navigator.mimeTypes && navigator.mimeTypes.length > 0) { var mimes = navigator.mimeTypes; for (var i=0; i < mimes.length; i++) { message += "<b>" + mimes[i].type + "</b> : " + mimes[i].description + "<br />"; } } else { message = "Your browser does not support this "; //sorry! } return ( message); } </script> </head> <body> <div id="dvData"> <table> <tr> <th>Column One </th> <th>Column Two</th> <th>Column Three</th> </tr> <tr> <td>row1 Col1</td> <td>row1 Col2</td> <td>row1 Col3</td> </tr> <tr> <td>row2 Col1</td> <td>row2 Col2</td> <td>row2 Col3</td> </tr> <tr> <td>row3 Col1</td> <td>row3 Col2</td> <td>row3 Col3</td> </tr> </table> </div> <br/> <input type="button" id="btnExport" value=" Export Table data into Excel " /> </body>

Errores:

CSV: no reconocido en los navegadores

ODS y Excel: ¿funciona pero no puedo encontrar cuál generar cuando el sistema tiene instalado Excel o Open Office instalado?

IE versión 8: no funciona, se abre en una nueva ventana y en la siguiente captura de pantalla.


Manifestación

Vea abajo para una explicación.

$(document).ready(function() { function exportTableToCSV($table, filename) { var $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 csv = ''"'' + $rows.map(function(i, row) { var $row = $(row), $cols = $row.find(''td''); return $cols.map(function(j, col) { var $col = $(col), text = $col.text(); return text.replace(/"/g, ''""''); // escape double quotes }).get().join(tmpColDelim); }).get().join(tmpRowDelim) .split(tmpRowDelim).join(rowDelim) .split(tmpColDelim).join(colDelim) + ''"''; // Deliberate ''false'', see comment below if (false && window.navigator.msSaveBlob) { var blob = new Blob([decodeURIComponent(csv)], { type: ''text/csv;charset=utf8'' }); // Crashes in IE 10, IE 11 and Microsoft Edge // See MS Edge Issue #10396033 // Hence, the deliberate ''false'' // This is here just for completeness // Remove the ''false'' at your own risk window.navigator.msSaveBlob(blob, filename); } else if (window.Blob && window.URL) { // HTML5 Blob var blob = new Blob([csv], { type: ''text/csv;charset=utf-8'' }); var csvUrl = URL.createObjectURL(blob); $(this) .attr({ ''download'': filename, ''href'': csvUrl }); } else { // Data URI var csvData = ''data:application/csv;charset=utf-8,'' + encodeURIComponent(csv); $(this) .attr({ ''download'': filename, ''href'': csvData, ''target'': ''_blank'' }); } } // This must be a hyperlink $(".export").on(''click'', function(event) { // CSV var args = [$(''#dvData>table''), ''export.csv'']; exportTableToCSV.apply(this, args); // If CSV, don''t do event.preventDefault() or return false // We actually need this to be a typical hyperlink }); });

a.export, a.export:visited { display: inline-block; text-decoration: none; color: #000; background-color: #ddd; border: 1px solid #ccc; padding: 8px; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <a href="#" class="export">Export Table data into Excel</a> <div id="dvData"> <table> <tr> <th>Column One</th> <th>Column Two</th> <th>Column Three</th> </tr> <tr> <td>row1 Col1</td> <td>row1 Col2</td> <td>row1 Col3</td> </tr> <tr> <td>row2 Col1</td> <td>row2 Col2</td> <td>row2 Col3</td> </tr> <tr> <td>row3 Col1</td> <td>row3 Col2</td> <td>row3 Col3</td> </tr> <tr> <td>row4 ''Col1''</td> <td>row4 ''Col2''</td> <td>row4 ''Col3''</td> </tr> <tr> <td>row5 &quot;Col1&quot;</td> <td>row5 &quot;Col2&quot;</td> <td>row5 &quot;Col3&quot;</td> </tr> <tr> <td>row6 "Col1"</td> <td>row6 "Col2"</td> <td>row6 "Col3"</td> </tr> </table> </div>

A partir de 2017

Ahora usa HTML5 Blob y URL como el método preferido con el Data URI como alternativa.

En Internet Explorer

Otras respuestas sugieren window.navigator.msSaveBlob ; sin embargo, se sabe que bloquea IE10 / Window 7 e IE11 / Windows 10 . Si funciona con Microsoft Edge es dudoso (consulte el boleto de Microsoft Edge versión 10396033 ).

Simplemente llamando a esto en la propia Developer Tools / Console de Microsoft hace que el navegador se bloquee:

navigator.msSaveBlob(new Blob(["hello"], {type: "text/plain"}), "test.txt");

Cuatro años después de mi primera respuesta, las nuevas versiones de IE incluyen IE10, IE11 y Edge. Todos chocan con una función inventada por Microsoft (aplauso lento).

Agregue el soporte de navigator.msSaveBlob bajo su propio riesgo.

Como de 2013

Normalmente esto se llevaría a cabo utilizando una solución del lado del servidor, pero este es mi intento de una solución del lado del cliente. Simplemente eliminar HTML como un Data URI no funcionará, pero es un paso útil. Asi que:

  1. Convierta el contenido de la tabla en una cadena con formato CSV válida. (Esta es la parte facil.)
  2. Fuerce al navegador para descargarlo. El enfoque window.open no funcionaría en Firefox, así que usé <a href="{Data URI here}"> .
  3. Asigne un nombre de archivo predeterminado utilizando el atributo de download la etiqueta <a> , que solo funciona en Firefox y Google Chrome. Como es solo un atributo, se degrada graciosamente.

Notas

Compatibilidad

Las pruebas de navegadores incluyen:

  • Firefox 20+, Win / Mac ( funciona )
  • Google Chrome 26+, Win / Mac ( funciona )
  • Safari 6, Mac ( funciona , pero se ignora el nombre del archivo)
  • IE 9+ ( falla )

Codificación de contenido

El CSV se exporta correctamente, pero cuando se importa a Excel, el carácter ü se imprime como ä . Excel interpreta el valor incorrectamente.

Introducir var csv = ''/ufeff''; y luego Excel 2013+ interpreta los valores correctamente.

Si necesita compatibilidad con Excel 2007, agregue los prefijos UTF-8 en cada valor de datos. Ver también:

  • ¿Es posible obligar a Excel a reconocer archivos UTF-8 CSV automáticamente?
  • Microsoft Excel destruye Diacritics en archivos .csv?
  • Agregar BOM UTF-8 a la cadena / Blob

¿Qué sucede si tiene sus datos en formato CSV y los convierte a HTML para visualizarlos en la página web? Puede usar el http://code.google.com/p/js-tables/ plugin. Verifique este ejemplo http://code.google.com/p/js-tables/wiki/Table Como ya está utilizando la biblioteca jQuery, he supuesto que puede agregar otras bibliotecas de juegos de herramientas de JavaScript.

Si los datos están en formato CSV, debería poder utilizar el tipo mime genérico ''application / octetstream''. Los 3 tipos de mime que ha probado dependen del software instalado en la computadora del cliente.


No estoy seguro de si el código de generación de CSV anterior es tan bueno como parece omitir las celdas y tampoco parece permitir comas en el valor. Así que aquí está mi código de generación CSV que podría ser útil.

Asume que tienes la variable $table , que es un objeto jQuery (por ejemplo, var $table = $(''#yourtable''); )

$rows = $table.find(''tr''); var csvData = ""; for(var i=0;i<$rows.length;i++){ var $cells = $($rows[i]).children(''th,td''); //header or content cells for(var y=0;y<$cells.length;y++){ if(y>0){ csvData += ","; } var txt = ($($cells[y]).text()).toString().trim(); if(txt.indexOf('','')>=0 || txt.indexOf(''/"'')>=0 || txt.indexOf(''/n'')>=0){ txt = "/"" + txt.replace(//"/g, "/"/"") + "/""; } csvData += txt; } csvData += ''/n''; }


Por lo que entiendo, tiene sus datos en una tabla y desea crear el CSV a partir de esos datos. Sin embargo, tienes problemas para crear el archivo CSV.

Mis pensamientos serían iterar y analizar el contenido de la tabla y generar una cadena a partir de los datos analizados. Puede consultar Cómo convertir JSON a formato CSV y almacenar en una variable para un ejemplo. Está utilizando jQuery en su ejemplo para que no cuente como un complemento externo. Luego, solo tiene que servir la cadena resultante usando window.open y usar la application/octetstream como se sugiere.


Una pequeña actualización para la respuesta de @Terry Young , es decir, agregue la compatibilidad con IE 10+

if (window.navigator.msSaveOrOpenBlob) { // IE 10+ var blob = new Blob([decodeURIComponent(encodeURI(csvString))], { type: ''text/csv;charset='' + document.characterSet }); window.navigator.msSaveBlob(blob, filename); } else { // actual real browsers //Data URI csvData = ''data:application/csv;charset=utf-8,'' + encodeURIComponent(csvData); $(this).attr({ ''download'': filename, ''href'': csvData, ''target'': ''_blank'' }); }


<a id="export" role=''button''> Click Here To Download Below Report </a> <table id="testbed_results" style="table-layout:fixed"> <thead> <tr width="100%" style="color:white" bgcolor="#3195A9" id="tblHeader"> <th>Name</th> <th>Date</th> <th>Speed</th> <th>Column2</th> <th>Interface</th> <th>Interface2</th> <th>Sub</th> <th>COmpany result</th> <th>company2</th> <th>Gen</th> </tr> </thead> <tbody> <tr id="samplerow"> <td>hello</td> <td>100</td> <td>200</td> <td>300</td> <td>html2svc</td> <td>ajax</td> <td>200</td> <td>7</td> <td>8</td> <td>9</td> </tr> <tr> <td>hello</td> <td>100</td> <td>200</td> <td>300</td> <td>html2svc</td> <td>ajax</td> <td>200</td> <td>7</td> <td>8</td> <td>9</td> </tr> </tbody> </table>

$(document).ready(function () { Html2CSV(''testbed_results'', ''myfilename'',''export''); }); function Html2CSV(tableId, filename,alinkButtonId) { var array = []; var headers = []; var arrayItem = []; var csvData = new Array(); $(''#'' + tableId + '' th'').each(function (index, item) { headers[index] = ''"'' + $(item).html() + ''"''; }); csvData.push(headers); $(''#'' + tableId + '' tr'').has(''td'').each(function () { $(''td'', $(this)).each(function (index, item) { arrayItem[index] = ''"'' + $(item).html() + ''"''; }); array.push(arrayItem); csvData.push(arrayItem); }); var fileName = filename + ''.csv''; var buffer = csvData.join("/n"); var blob = new Blob([buffer], { "type": "text/csv;charset=utf8;" }); var link = document.getElementById(alinkButton); if (link.download !== undefined) { // feature detection // Browsers that support HTML5 download attribute link.setAttribute("href", window.URL.createObjectURL(blob)); link.setAttribute("download", fileName); } else if (navigator.msSaveBlob) { // IE 10+ link.setAttribute("href", "#"); link.addEventListener("click", function (event) { navigator.msSaveBlob(blob, fileName); }, false); } else { // it needs to implement server side export link.setAttribute("href", "http://www.example.com/export"); } } </script>