Saltar al contenido

Exportar tabla HTML a Excel usando Javascript

Encontramos la solución a esta dificultad, al menos eso creemos. Si presentas inquietudes puedes dejarlo en el apartado de comentarios, que con gusto te ayudaremos

Solución:

El 12 de julio de 2016, Microsoft lanzó una actualización de seguridad para Microsoft Office. Uno de los efectos de esta actualización fue evitar que Excel abriera archivos HTML de dominios no confiables, ya que no se pueden abrir en modo protegido.

TAMBIÉN hay una configuración de registro que evita que Excel abra archivos con la extensión de archivo .XLS cuyo contenido no coincida con el formato de archivo XLS oficial, aunque por defecto es “advertir”, no “negar”.

Antes de este cambio, era posible guardar datos HTML en un archivo con una extensión XLS, y Excel lo abriría correctamente, posiblemente dando una advertencia primero de que el archivo no coincidía con el formato de Excel, dependiendo del valor del usuario para el ExtensionHardening registro key (o valores de configuración relacionados).

Microsoft ha realizado una entrada en la base de conocimientos sobre el nuevo comportamiento con algunas soluciones alternativas sugeridas.

Varias aplicaciones web que anteriormente dependían de la exportación de archivos HTML como XLS han tenido problemas como resultado de la actualización; SalesForce es un ejemplo.

Es probable que las respuestas anteriores al 12 de julio de 2016 a esta y otras preguntas similares no sean válidas.

Vale la pena señalar que los archivos generados EN EL NAVEGADOR a partir de datos remotos no entran en conflicto con esta protección; solo impide la descarga de archivos de una fuente remota que no es de confianza. Por lo tanto, un posible enfoque es generar el archivo HTML con la etiqueta .XLS localmente en el cliente.

Otro, por supuesto, es producir un archivo XLS válido, que Excel luego abrirá en modo protegido.

ACTUALIZAR: Microsoft ha lanzado un parche para corregir este comportamiento: https://support.microsoft.com/en-us/kb/3181507

SheetJS parece perfecto para esto.

Para exportar su tabla como un archivo de Excel, use el código en este enlace (junto con SheetJS)

Simplemente conecte su table ID del elemento en export_table_to_excel

Ver demostración

Si el formato CSV le conviene, aquí tiene un ejemplo.

  • Ok … acabo de leer un comentario en el que dices explícitamente que no es bueno para ti. Mi mal por no aprender a leer antes de codificar.

Hasta donde yo sé, Excel puede manejar CSV.

function fnExcelReport() 
var i, j;
var csv = "";

var table = document.getElementById("table");

var table_headings = table.children[0].children[0].children;
var table_body_rows = table.children[1].children;

var heading;
var headingsArray = [];
for(i = 0; i < table_headings.length; i++) 
  heading = table_headings[i];
  headingsArray.push('"' + heading.innerHTML + '"');


csv += headingsArray.join(',') + ";n";

var row;
var columns;
var column;
var columnsArray;
for(i = 0; i < table_body_rows.length; i++) 
  row = table_body_rows[i];
  columns = row.children;
  columnsArray = [];
  for(j = 0; j < columns.length; j++) 
      var column = columns[j];
      columnsArray.push('"' + column.innerHTML + '"');
  
  csv += columnsArray.join(',') + ";n";


  download("export.csv",csv);


//From: http://stackoverflow.com/a/18197511/2265487
function download(filename, text) 
    var pom = document.createElement('a');
    pom.setAttribute('href', 'data:text/csv;charset=utf-8,' + encodeURIComponent(text));
    pom.setAttribute('download', filename);

    if (document.createEvent) 
        var event = document.createEvent('MouseEvents');
        event.initEvent('click', true, true);
        pom.dispatchEvent(event);
    
    else 
        pom.click();
    


Call this function on



Head1 Head2 Head3 Head4
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44

Puedes animar nuestro quehacer escribiendo un comentario o puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *