Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Funcion para exportar a CSV con Javascript

Estas en el tema de Funcion para exportar a CSV con Javascript en el foro de Javascript en Foros del Web. Buenas a todos, de antemano me disculpo si este hilo presenta alguna inconsistencia dado que soy nuevo, bueno a lo que venimos, como el titulo ...
  #1 (permalink)  
Antiguo 27/09/2012, 14:32
Avatar de arrakshe  
Fecha de Ingreso: septiembre-2012
Mensajes: 19
Antigüedad: 11 años, 6 meses
Puntos: 2
Funcion para exportar a CSV con Javascript

Buenas a todos, de antemano me disculpo si este hilo presenta alguna inconsistencia dado que soy nuevo, bueno a lo que venimos, como el titulo indica estoy en busca de una manera efectiva de exportar/guardar archivos en formato csv desde javascript, específicamente mediante una función que reciba los datos y los mande a descargar/guardar, para dar una idea del ambiente en el que me encuentro, estoy trabajando con smartGwt, GWT(Google Web ToolKit) y java, para ello utilizo eclipse (helios), dado que utilizo la versión gratis de smartGwt esta viene sin la función de Grid.exportData() por lo tanto me ha tocado buscar otro camino para exportar los datos de determinados grids, investigando me di cuenta que gracias a JSNI(JavaScript Native Interface creo...) puedo invocar funciones de javascript desde smartgwt, ya tengo la información en formato csv y tengo una función en javaScript que hace casi todo... lo malo es que no coloca un nombre por defecto ni le asigna la extencion que corresponde, siempre los guarda como algo asi "kfbhfglsd.part" , como hasta ahora toco javascript me encuentro perdido, abra alguna otra forma de hacerlo? o tal vez me falta algo en mi funcion?, quitando lo del nombre lo que de verdad me interesa es que lo guarde con la extencion que le corresponde, el nombre no importa si se queda asi, les dejo el codigo y espero sus respuestas, muchas gracias. Nota, esto funciona para Chrome y Firefox para IE no sirve

Código:


Código Javascript:
Ver original
  1. function exportar(data) {
  2.  
  3.   var uriContent = "data:application/csv," + encodeURIComponent(data);
  4.   var myWindow = window.open(uriContent, "Export CSV");
  5.   myWindow.focus();
  6. }
  #2 (permalink)  
Antiguo 28/09/2012, 09:53
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Funcion para exportar a CSV con Javascript

Hola arrakshe, bienvenido.

Tu descripción no es mala, pero hay alguna mala interpretación.
Javascript no crea documentos. Como mucho te va a convertir una cadena que tiene (p.e.) un código de creación de tabla, en otra cadena con los datos separados por comas. Siempre que le escribas la función correspondiente, porque no es nativa.

Si estás nombrando distintos navegadores, es porque lo querés hacer desde una página web, y las páginas web, por supuesto, no generan documentos. Guardan los que ya están hechos.
Es por una cuestión de seguridad.

Quien te hace el *.csv es una aplicación que puede estar integrada a un navegador, y generalmente hay que descargarla y autorizarla.
Internet Explorer lo hacía con DX integrados al S.O. Windows, pero hoy también hay que darle mil autorizaciones y bajar niveles de seguridad.

Como ya tenés una de esas aplicaciones que seguramente harás bajar a los usuarios de tu red o a tus clientes, es muy posible -como decís- que se le pueda controlar algo desde un escript.
Quizá hasta la estensión y el nombre de archivo a guardar se le puedan mandar como parámetros.

Pero no es javascript, y va a ser más fácil preguntar en el foro de soporte de esas aplicaciones, o en un subforo de aquí que sea más apropiado, porque esas líneas de código van a ser "propietarias".

Lamento no conocer más del asunto. Igual este tema no se cierra, así que siempre puede pasar alguien que sepa o haya tenido su experiencia con smartgwt. Si te parece, esperás un poco, y después reportás para que se mueva el tema.

Saludos
furoya.


p.d.: ¿y mandar la cadena a PHP para que el servidor haga un documento descargable?
  #3 (permalink)  
Antiguo 28/09/2012, 12:25
Avatar de arrakshe  
Fecha de Ingreso: septiembre-2012
Mensajes: 19
Antigüedad: 11 años, 6 meses
Puntos: 2
Respuesta: Funcion para exportar a CSV con Javascript

Muchas Gracias furoya, con esto me aclaraste muchas cosas, para contarte un poco, puse un mensaje para que el usuario le colocara la extensión manualmente ya sea .csv, .xls o .txt yo se que esto no es 100% practico pero de momento funciona, voy a tener en cuenta lo del servidor ya que trabaja con php (pero igual hasta ahorita lo estoy tocando XD y para rematar es algo diferente de lo usual) , muchas gracias!!!
  #4 (permalink)  
Antiguo 28/09/2012, 16:15
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Funcion para exportar a CSV con Javascript

Yo te recomendaría que lo intentes con php ya que dispone de funciones específicas

http://php.net/manual/es/function.fputcsv.php

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 28/09/2012, 16:35
 
Fecha de Ingreso: julio-2011
Mensajes: 220
Antigüedad: 12 años, 8 meses
Puntos: 72
Respuesta: Funcion para exportar a CSV con Javascript

¿Para qué usas encodeURIContent()? Me parece que si no se usara funcionaría de manera correcta, si es que el archivo CSV ya existe, bueno tambien habría que quitar "data:application/csv,"

Código Javascript:
Ver original
  1. function exportar(data) {
  2.       var myWindow = window.open(data, "Export CSV");
  3.       myWindow.focus();
  4.     }

Ahora si relamente quieres usar encodeURIComponent(), entonces hay que emplear decodeURIComponent()

Código Javascript:
Ver original
  1. function exportar(data) {
  2.       var uriContent = encodeURIComponent(data);
  3.       var myWindow = window.open(decodeURIComponent(uriContent), "Export CSV");
  4.       myWindow.focus();
  5.     }

Pero no veo el caso de esto.
  #6 (permalink)  
Antiguo 28/09/2012, 17:12
Avatar de arrakshe  
Fecha de Ingreso: septiembre-2012
Mensajes: 19
Antigüedad: 11 años, 6 meses
Puntos: 2
Respuesta: Funcion para exportar a CSV con Javascript

Cita:
Iniciado por emprear Ver Mensaje
Yo te recomendaría que lo intentes con php ya que dispone de funciones específicas

[url]http://php.net/manual/es/function.fputcsv.php[/url]

SAludos
Hola, muchas gracias por contestar, el asunto con no utilizar php se da porque quería hacer todo del lado del cliente y si lo hiciera con php tendría que llamar al servidor(sin mencionar que no lo manejo al 100% dado que utilizo un server en php ya creado que usa x7cloud por consiguiente mis llamados son un poco limitados y estoy empezando en php...), la idea de hacerlo con javascript es porque con la JSNI puedo hacer llamados de funciones de javascript desde smartGwt mediante métodos nativos y ya que uso la versión free de smartGwt esta opción viene desactivada...
  #7 (permalink)  
Antiguo 28/09/2012, 17:29
Avatar de arrakshe  
Fecha de Ingreso: septiembre-2012
Mensajes: 19
Antigüedad: 11 años, 6 meses
Puntos: 2
Respuesta: Funcion para exportar a CSV con Javascript

Cita:
Iniciado por lubtufano Ver Mensaje
¿Para qué usas encodeURIContent()? Me parece que si no se usara funcionaría de manera correcta, si es que el archivo CSV ya existe, bueno tambien habría que quitar "data:application/csv,"

Código Javascript:
Ver original
  1. function exportar(data) {
  2.       var myWindow = window.open(data, "Export CSV");
  3.       myWindow.focus();
  4.     }

...

Pero no veo el caso de esto.
Hola, muchas gracias por aportar, vieras que probé esos ejemplos que pusiste y lo que hacen es tratar de abrir una nueva pestaña en donde se mostrarían los datos sin embargo dada la forma en la que funciona mi aplicación el servidor impide dicha apertura, con el código que tengo se genera la orden de guardado de un archivo(solo del lado del cliente y el archivo no existe como en php) ademas utilizo el encodeURIContent solo para que al momento en el que aparece la ventana de guardado del navegador no se vean los datos a simple vista, a parte de eso desconozco para que sirve . Al final mi código quedo asi, funciona para chrome y firefox descargando el archivo al cual solo hay que agregarle la extension correspondiente(.csv, .xls, .txt) y en IE abre una nueva ventana con la información(ya se que dije que el server no deja, pero parece que solo en IE lo permite, en los otros me niega el acceso)

Código Javascript:
Ver original
  1. function exportar(data) {
  2.            
  3.             if (navigator.appName == 'Microsoft Internet Explorer') {
  4.                
  5.                 var popup = window.open('','csv','');
  6.                 popup.document.body.innerHTML = '<pre>' + data + '</pre>';
  7.  
  8.             }else{
  9.                
  10.                 location.href='data:application/download; charset=utf8,' + encodeURIComponent(data);
  11.                
  12.             }
  13.  
  14.            
  15.             return true;
  16.            
  17.            
  18.         }
  #8 (permalink)  
Antiguo 28/09/2012, 17:42
Avatar de arrakshe  
Fecha de Ingreso: septiembre-2012
Mensajes: 19
Antigüedad: 11 años, 6 meses
Puntos: 2
Respuesta: Funcion para exportar a CSV con Javascript

Ahora una pregunta, alguien sabe que parámetros se pueden configurar en esta cadena de texto 'data:application/download; charset=utf8,' ??? no tengo la mas minima idea de que puede ir ahi, este fragmento de codigo "charset=utf8" lo agregue viendolo por ahi y se que me sirve para que el archivo que se descargue vaya con ese tipo de codificacion asi cuando se abre con openOfice no me pide el tipo de codicacion, si alguien me dijera mas o menos que se puede meter ahi seria de mucha ayuda!!!

Etiquetas: csv, funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:43.