¿Cómo puedo exportar tablas a Excel desde una página web

¿Cómo puedo exportar tablas para excel desde una página web? Quiero que la exportación contenga todo el formato y los colores.

Lejos y lejos, la exportación más limpia y fácil desde las tablas a Excel es el plugin Jquery DataTables Table Tools. Obtiene una cuadrícula que ordena, filtra, ordena y ubica sus datos, y con solo unas pocas líneas adicionales de código y dos pequeños archivos incluidos, obtiene la exportación a Excel, PDF, CSV, al portapapeles y a la impresora.

Este es todo el código que se requiere:

  $(document).ready( function () { $('#example').dataTable( { "sDom": 'T<"clear">lfrtip', "oTableTools": { "sSwfPath": "/swf/copy_cvs_xls_pdf.swf" } } ); } ); 

Por lo tanto, es rápido de implementar, sin limitaciones del navegador, no se requiere un lenguaje del lado del servidor y, sobre todo, es muy FÁCIL de entender. Es un ganar-ganar. Sin embargo, lo único que tiene límites es el estricto formato de las columnas.

Si el formateo y los colores son un factor decisivo absoluto, el único método de navegador cruzado 100% confiable que he encontrado es utilizar un lenguaje del lado del servidor para procesar los archivos de Excel correctos de su código. Mi solución de elección es PHPExcel. Es la única que he encontrado hasta ahora que maneja de forma positiva la exportación con formato a una versión MODERNA de Excel desde cualquier navegador cuando le das nada más que HTML. Sin embargo, déjenme aclarar que definitivamente no es tan fácil como la primera solución, y también es un poco de recursos. Sin embargo, en el lado positivo, también puede enviarse directamente a PDF. Y, una vez que lo configuras, simplemente funciona, todo el tiempo.

ACTUALIZACIÓN – 15 de septiembre de 2016: TableTools se ha suspendido a favor de un nuevo complemento llamado ” botones ” Estas herramientas realizan las mismas funciones que la antigua extensión TableTools, pero son mucho más fáciles de instalar y hacen uso de descargas HTML5 para navegadores modernos, con la capacidad de retroceder a la descarga Flash original para navegadores que no son compatibles con el estándar HTML5. Como puede ver en los numerosos comentarios desde que publiqué esta respuesta en 2011, se ha abordado la debilidad principal de TableTools. Todavía no puedo recomendar DataTables lo suficiente para manejar grandes cantidades de datos, tanto para el desarrollador como para el usuario.

Hace mucho tiempo, descubrí que Excel abriría un archivo HTML con una tabla si lo enviamos con el tipo de contenido de Excel. Considera el documento de arriba:

    Java Friends   
ab
12

Ejecuté el siguiente bookmarklet en él:

 javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML); 

y de hecho lo tengo descargable como un archivo de Excel. Sin embargo , no obtuve el resultado esperado: el archivo estaba abierto en OpenOffice.org Writer. Ese es mi problema: no tengo Excel en esta máquina, así que no puedo probarlo mejor. Además, este truco funcionó hace más o menos seis años con navegadores más antiguos y una versión antigua de MS Office, así que realmente no puedo decir si funcionará hoy.

De todos modos, en el documento anterior agregué un botón que descargaría el documento completo como un archivo de Excel, en teoría:

    Java Friends   
ab
12

Guárdelo en un archivo y haga clic en el botón. Me encantaría saber si funcionó o no, así que le pido que comenten incluso por decir que no funcionó.

Es posible usar el antiguo formato XML de Excel 2003 (antes de OpenXML) para crear una cadena que contenga el XML deseado, luego, en el lado del cliente, podría usar un URI de datos para abrir el archivo usando el tipo de mímica XSL, o enviar el archivo al cliente usando el tipo de documento “Tipo de contenido: aplicación / vnd.ms-excel” de Excel desde el lado del servidor.

  1. Abra Excel y cree una hoja de trabajo con el formato y los colores deseados.
  2. Guarde el libro de Excel como “XML Spreadsheet 2003 (* .xml)”
  3. Abra el archivo resultante en un editor de texto como el bloc de notas y copie el valor en una cadena en su aplicación
  4. Suponiendo que usa el enfoque del lado del cliente con un uri de datos, el código se vería así:
    
     
  5. Luego puede usar la cadena reemplazar para crear una colección de filas para insertar en su plantilla de hoja de cálculo
    
     
  6. Una vez que tenga la información recostackda, cree la cadena final y abra una nueva ventana usando el URI de datos.

     

    window.open ('data: application / vnd.ms-excel,' + hoja de trabajo);

Vale la pena señalar que los navegadores más antiguos no son compatibles con el esquema de URI de datos, por lo que es posible que deba generar el lado del servidor de archivos para aquellos navegadores que no lo admitan.

También es posible que deba realizar la encoding base64 en el contenido de URI de datos, que puede requerir una biblioteca js , así como agregar la cadena '; base64' después del tipo MIME en el URI de datos.

Excel tiene una característica poco conocida llamada “consultas web” que le permite recuperar datos de casi todas las páginas web sin progtwigción adicional.

Una consulta web básicamente ejecuta una solicitud HTTP directamente desde Excel y copia algunos o todos los datos recibidos (y opcionalmente formateando) en la hoja de trabajo.

Una vez que haya definido la consulta web, puede actualizarla en cualquier momento sin abandonar Excel. Por lo tanto, no tiene que “exportar” datos y guardarlos en un archivo. Prefiere actualizar los datos de la misma manera que desde una base de datos.

Incluso puede hacer uso de parámetros de URL haciendo que Excel le solicite ciertos criterios de filtro, etc.

Sin embargo, los inconvenientes que he notado hasta ahora son:

  • los datos cargados dinámicamente no son accesibles, porque Javascript no se ejecuta
  • La longitud de la URL es limitada

Aquí hay una pregunta sobre cómo crear consultas web en Excel. Se vincula a un sitio de Ayuda de Microsoft sobre Cómo obtener información externa de una página web

Este es un php pero quizás puedas cambiarlo a javascript:

  $colgroup = str_repeat("",5); $data = ""; $time = date("M d, yg:ia"); $excel = "        
$colgroup
Col1Col2Col3Col4Col5
12345
"; $fname = "Export".time().".xls"; $file = fopen($fname,"w+"); fwrite($file,$excel); fclose($file); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename="'.basename($fname).'"'); readfile($fname); unlink($fname); ?>

En primer lugar, no recomendaría intentar exportar Html y espero que la instancia del usuario de Excel lo recoja. Mi experiencia es que esta solución está plagada de problemas, incluidas las incompatibilidades con los clientes de Macintosh y que se genera un error para el usuario de que el archivo en cuestión no tiene el formato especificado. La solución más fácil de usar y a prueba de balas es la del lado del servidor donde se usa una biblioteca para crear un archivo Excel real y enviarlo de vuelta al usuario. La siguiente mejor solución y una solución más universal sería usar el formato Open XML. Me he encontrado con algunos problemas de compatibilidad poco comunes con las versiones anteriores de Excel, pero en general esto debería darte una solución que funcionará en cualquier versión de Excel, incluidos los Mac.

Open XML

mozilla aún admite URI de base 64. Esto le permite componer dinámicamente el contenido binario usando javascript:

  download xls 

si su archivo de Excel no es muy sofisticado (sin diagtwigs, fórmulas, macros), puede profundizar en el formato y componer bytes para su archivo, luego codificarlos con base64 y ponerlos en el href

consulte https://developer.mozilla.org/en/data_URIs

Este código solo es IE, por lo que solo es útil en situaciones en las que sabe que todos sus usuarios utilizarán IE (como, por ejemplo, en algunos entornos corporativos).

  

Suposiciones

  1. URL dada

  2. la conversión tiene que hacerse en el lado del cliente

  3. los sistemas son Windows, Mac y Linux

Solución para Windows:

código python que abre la ventana ie y tiene acceso a ella: la variable theurl contiene la url (‘http: //’)

 ie = Dispatch("InternetExplorer.Application") ie.Visible = 1 ie.Navigate(theurl) 

Nota: si no se puede acceder a la página directamente, pero debe iniciar sesión, tendrá que manejar esto ingresando los datos del formulario y emulando las acciones del usuario con python.

aquí está el ejemplo

 from win32com.client import Dispatch ie.Document.all('username').value=usr ie.Document.all('password').value=psw 

de la misma manera para la recuperación de datos de la página web. Digamos que el elemento con id ‘el1’ contiene los datos. recuperar el texto del elemento a la variable

 el1 = ie.Document.all('el1').value 

luego, cuando los datos están en la variable python, puede abrir la pantalla de Excel de manera similar usando Python:

 from win32com.client import Dispatch xlApp = Dispatch("Excel.Application") xlWb = xlApp.Workbooks.Open("Read.xls") xlSht = xlWb.WorkSheets(1) xlSht.Cells(row, col).Value = el1 

Solución para Mac:

solo el consejo: use AppleScript; tiene una API simple y similar a la de Win32com.client. Despacho

Solución para Linux:

java.awt.Robot podría funcionar para esto, tiene un clic, presionar una tecla (se pueden usar teclas de acceso rápido), pero ninguna API para Linux que yo sepa puede funcionar tan simple como AppleScript

En realidad, esto es más simple de lo que creería: “Simplemente” copie la tabla HTML (es decir: el código HTML de la tabla) en el portapapeles. Excel sabe cómo decodificar tablas HTML; incluso tratará de preservar los atributos.

La parte difícil es “copiar la tabla en el portapapeles” ya que no hay una forma estándar de acceder al portapapeles desde JavaScript. Ver esta publicación en el blog: Acceder al portapapeles del sistema con JavaScript: ¿un Santo Grial?

Ahora todo lo que necesitas es la tabla como HTML. Sugiero jQuery y el método html () .

simple búsqueda en google apareció esto:

Si los datos son en realidad una página HTML y NO han sido creados por ASP, PHP u otro lenguaje de scripting, y está utilizando Internet Explorer 6, y tiene Excel instalado en su computadora, simplemente haga clic derecho en la página y mire a través del menú. Debería ver “Exportar a Microsoft Excel”. Si todas estas condiciones son verdaderas, haga clic en el elemento del menú y después de algunas indicaciones se importará a Excel.

si no puede hacer eso, le da un método alternativo de “arrastrar y soltar”:

http://www.mrkent.com/tools/converter/

Y ahora hay una mejor manera.

SDK de OpenXML para JavaScript.

https://openxmlsdkjs.codeplex.com/

Hay dos maneras prácticas de hacerlo de forma automática, mientras que solo se puede usar una solución en todos los navegadores. En primer lugar, debe usar la especificación open xml para comstackr la hoja de Excel. Hay complementos gratuitos de Microsoft disponibles que hacen que este formato también esté disponible para versiones anteriores de la oficina. El xml abierto es estándar desde Office 2007. Las dos formas son obvias en el servidor o en el cliente.

La implementación del cliente utiliza un nuevo estándar de CSS que le permite almacenar datos en lugar de solo la URL de los datos. Este es un gran enfoque, ya que no necesita ninguna llamada al servidor, solo los datos y algunos javascript. Lo malo es que Microsoft no admite todas las partes en las versiones actuales de IE (no sé sobre IE9). Microsoft restringe los datos para que sean una imagen, pero necesitaremos un documento. En Firefox funciona bastante bien. Para mí, el IE fue el punto de muerte.

La otra forma es utilizar una implementación en el servidor. Debería haber muchas implementaciones de XML abierto para todos los idiomas. Solo necesitas apuntar uno. En la mayoría de los casos, será la forma más simple de modificar un modelo de vista para dar como resultado un documento, pero con seguridad puede enviar todos los datos desde Clientside al servidor y hacer lo mismo.

  function normalexport() { try { var i; var j; var mycell; var tableID = "tblInnerHTML"; var drop = document.getElementById('<%= ddl_sections.ClientID %>'); var objXL = new ActiveXObject("Excel.Application"); var objWB = objXL.Workbooks.Add(); var objWS = objWB.ActiveSheet; var str = filterNum(drop.options[drop.selectedIndex].text); objWB.worksheets("Sheet1").activate; //activate dirst worksheet var XlSheet = objWB.activeSheet; //activate sheet XlSheet.Name = str; //rename for (i = 0; i < document.getElementById("ctl00_ContentPlaceHolder1_1").rows.length - 1; i++) { for (j = 0; j < document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells.length; j++) { mycell = document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells(j); objWS.Cells(i + 1, j + 1).Value = mycell.innerText; // objWS.Cells(i + 1, j + 1).style.backgroundColor = mycell.style.backgroundColor; } } objWS.Range("A1", "L1").Font.Bold = true; // objWS.Range("A1", "L1").Font.ColorIndex = 2; // objWS.Range("A1", "Z1").Interior.ColorIndex = 47; objWS.Range("A1", "Z1").EntireColumn.AutoFit(); //objWS.Range("C1", "C1").ColumnWidth = 50; objXL.Visible = true; } catch (err) { alert("Error. Scripting for ActiveX might be disabled") return } idTmr = window.setInterval("Cleanup();", 1); } function filterNum(str) { return str.replace(/[ / ]/g, ''); }