https://foro.gambas-es.org/viewtopic.php?f=5&t=76
-----------------------------------
soplo
Lunes, 28 Septiembre 2009, 00:13

Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Como bien dice el título se trata de crear un procedimiento que sirva para pastear un gridview en una hoja de cálculo.

Las hojas de cálculo utilizan para separar una celda de otra el caracter TAB que en gambas se correponde con gb.tab chr(9)
En microsoft para separar unas filas de otras se utiliza CRLF que corresponde a gb.tab + key.enter. 
En Unix/Linux para separar unas filas de otras se utiliza LF que corresponde a gb.newline chr(10)

Adaptar esta rutina a vuestro caso según necesiteis.

Doy por creado un gridview al que llamaré gd
Creo un botón al que le asigno este código:

[code linenumbers=false syntax=gambas]Sub Boton_click()
 'declarar variables
 DIM Grid AS String, fila AS Integer, Columna AS Integer
 DIM, MaxFilas AS Integer, MaxColumnas AS Integer
[/code]

[color=darkred]Inicializar valores[/color]
[code linenumbers=false syntax=gambas]  MaxColumnas = gd.columns.count - 1 '---> número de columnas de gd
  Maxfilas = gd.Rows.count - 1 '---> número de filas de gd
[/code]
[color=darkred] copiar el encabezado horizontal de gd[/color]
[code linenumbers=false syntax=gambas]  FOR columna = 0 TO MaxColumnas '---> para cada columna
    Grid &= gd.Columns[columna].text  '---> poner el encabezado de columna
    IF columna < MaxColumnas THEN 
      Grid &= gb.Tab '---> añadir un TAB si no es la última columna
    ELSE
      Grid &= gb.NewLine '---> añadir un LF si es la última columna
    ENDIF 
  NEXT  [/code]

[color=darkred]copiar datos[/color]
[code linenumbers=false syntax=gambas]  FOR fila = 0 TO Maxfilas '---> para cada fila
    FOR columna = 0 TO MaxColumnas '---> para cada columna
      grid &= gd[fila, columna].Text  ' copiar el valor de la celda
      IF columna < MaxColumnas THEN 
        Grid &= gb.Tab '---> añadir un TAB si no es la última columna
      ELSE 
        Grid &= gb.NewLine '---> añadir un LF si es la última columna
      ENDIF 
    NEXT 
  NEXT [/code]

Todo queda almacenado en un string llamado grid que envío al portapapeles
'Pasar el resultado al portapapeles. 
[code linenumbers=false syntax=gambas]  Clipboard.Copy(Grid)
end[/code]

Ahora os vais a gnumeric o la que sea y le haceis un paste en la celda donde quereis que quede la esquina superior izquierda de vuestro grid.  En el caso de gnumeric sale un asistente al que solo habrá que aceptar. En otros casos ni eso.
 :mryellow:


-----------------------------------
jguardon
Miercoles, 30 Septiembre 2009, 11:51

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Está bien

Yo lo hago diferente, es decir, no copio y pego, directamente exporto el contenido del GridView a un fichero csv:

[code linenumbers=false syntax=gambas]
PUBLIC SUB btnPrintCSV_Click()
    DIM i, j, k AS Integer
    DIM s AS String
    DIM fic AS File
    DIM path AS String = Temp & ".csv"    
    s &= "\"\","
    FOR k = 0 TO global.getBandas().Count - 1            ' una funcion que devuelve los 
        s &= "\"" & global.getBandas()[k] & "\","        ' textos de cabeceras
    NEXT
    FOR i = 0 TO gv.Rows.Count - 1                       ' bucle que obtiene filas
        s &= "\n"
        FOR j = 0 TO gv.Columns.Count - 1                ' bucle anidado que obtiene el contenido
            s &= "\"" & gv[i, j].Text & "\","            ' de cada celda
        NEXT 
    NEXT 
    OPEN path FOR WRITE CREATE AS #fic
    PRINT #fic, s                                        ' creo e imprimo un fichero temporal
    CLOSE #fic
    'Desktop.Open(path)
    SHELL "ooffice -calc " & path                        ' lo abro con oo (me sale asistente de
    CATCH                                                ' para importar
        Message.Error(Error.Text & "\n" & Error.Where)    
END[/code]

Lo que hago es recorrer todas las celdas de cada fila, extrayendo el texto y formateándolo en el clásico csv, campos entrecomillados separados por comas.

Por si le sirve a alguien


-----------------------------------
jsbsan
Domingo, 04 Abril 2010, 14:31

Error En El Codigo:Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Jguardon: me da error tu codigo, lo podias revisar?


-----------------------------------
jguardon
Domingo, 04 Abril 2010, 15:18

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
¿Qué error te da y dónde?

Lo único que he cambiado es
 DIM path AS String = Temp$ & ".csv"

por:

 DIM path AS String = Temp & ".csv", es decir, he quitado el símbolo $ al Temp porque el resaltado de sintaxis estaba funcionando mal y me introducía unos caracteres raros justo antes. (Miraré eso también).

También hay una llamada a una función que no está declarada en el fragmento de código expuesto, pero que no es más que un array que contiene los strings para las cabeceras.

Saludos


-----------------------------------
Cubel
Lunes, 05 Abril 2010, 13:57

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Voy a probar ha hacerlo yo. con los dos ejemplos supongo que no tendré problema. Pero tenia una duda, un csv lo pueden abrir desde el office de windows? es porque la mayoria de los clientes es muy probable que tengan el office de MS.

---------
Editado
..........


Creo que el error esta en " FOR k = 0 TO global.getBandas().Count - 1   " a mi me salta un error aqui que pone como que global no esta identificado...


-----------------------------------
jguardon
Lunes, 05 Abril 2010, 18:09

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Jaja... claro! Eso es un fragmento de código de una aplicación, por lo tanto "global" es un módulo y .getBandas() es una función que devuelve un String[] (array de cadenas), que representan los encabezados del gridview.

Sustituye eso por tu propio array, por ejemplo:

[code linenumbers=false syntax=gambas]
DIM myArr AS NEW String[]

myArr = ["Mi cabecera1", "Mi cabecera2", "Mi cabeceraN"]

' y en el bucle:

 FOR k = 0 TO myArr.Count - 1 

'....

[/code]

Respecto al formato CSV, sí se puede importar a MSOffice, pero [i]importar[/i], no es que se vaya a abrir directamente. 

Saludos


-----------------------------------
jsbsan
Lunes, 05 Abril 2010, 22:30

S &=  "\"\"," Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Creo que el error es que cuando pones "\\," el codigo resaltado lo traduce en "\"\"," y tambien pasa con "\" que lo convierte en "\""

Por ejemplo:  cuando pones

s&="\" & gv[i,j].Text & "\,"

el codigo resaltado lo traduce en:

s &=  "\"" &  gv[i, j].Text & "\","  


Y tambien pasa en:

s & ="\\,"

el codigo resaltado lo traduce en:

s &=  "\"\","


 ¿puede ser esto?


-----------------------------------
jguardon
Martes, 06 Abril 2010, 12:34

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
No, eso no es. La sintaxis es correcta, lo que pasa es que para poder imprimir las dobles comillas, debes de escaparlo antes con la barra invertida.

No puedes hacer esto para representar dobles comillas (ni simples):

ejemplo_cadena = " " "

ejemplo_cadena = " ' "

Tienes que hacerlo así:

ejemplo_cadena = " \" "

ejemplo_cadena = " \' "

Busca el error por otra parte, aunque como no dices el error que te da ni en qué línea, no podemos ayudarte mucho más.

Saludos


-----------------------------------
jsbsan
Jueves, 08 Abril 2010, 22:18

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
En la consola de gambas2 me da el siguiente error:

sh: ooffice: not found

¿tengo mal instalado el openoffice?


-----------------------------------
abarzuaf
Jueves, 08 Abril 2010, 22:50

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Parece que el SHELL no encuentra la ruta al ejecutable de OpenOffice.

Ideas para probar:

1) ¿Ejecutaste OpenOffice desde consola?,¿Funciona?

2) Ejecuta en la consola:[quote] locate ooffice[/quote] y revisa que las rutas estén correctas. En mi equipo con UBUNTU 9.10 - OpenOffice 3.1 son:
[code linenumbers=false syntax=gambas]/etc/bash_completion.d/ooffice.sh
/usr/bin/ooffice
[/code]

Saludos


-----------------------------------
Invitado
Viernes, 09 Abril 2010, 00:35

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Muy bueno y útil!

P.D: abarzuaf: ¿Por qué no actualizas a la versión 3.2 de OpenOffice?, se abre un 40 % más rápido que antes! (No soy el spamero de Gambas-es, pero si que recomiendo el ooffice 3.2)


-----------------------------------
Erik
Domingo, 23 Enero 2011, 07:30

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Estaba tonteando por aqui, cambiara mucho para crear un .ods?


-----------------------------------
jsbsan
Domingo, 23 Enero 2011, 12:16

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Si bastante... yo he echo un "control" para pasar datos de un archivos de texto a .odt (que lo pueda abrir directamente el openoffice writer)...

Tengo apuntado hacer lo mismo para la hoja de calculo, pero ahora mismo no tengo tiempo....

Te paso la dirección de descarga del control gb.odt (encontraras el codigo fuente para que veas como lo he hecho)

[url=http://jsbsan.blogspot.com/2010/12/gbodt-2-version_11.html]http://jsbsan.blogspot.com/2010/12/gbodt-2-version_11.html

 [img]http://foro.gambas-es.org/files/images/6/pantallazo_1295781355_457842.png[/img] 
Saludos.


-----------------------------------
Erik
Domingo, 23 Enero 2011, 17:39

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
sera muy dificil?, me puse a buscar y no he encontrado mucha info al respecto, lo que quiero hacer es exportar la info de un tableview a un .ods para graficar ahi las ventas de una tienda, me bastaria con un ejemplo simple donde se importe 2 columnas y 2 filas a un archivo ya creado o que lo cree en ese instante si no existe. He visto que se puede guardar la info para pegarla despues en un archivo abierto, pero no me gusta mucho esa idea ya que se puede prestar a equivocarse, mas si son muchas ventas al dia, gracias de antemano o si pudieras indicarme como buscar en google te lo agradeceria tambien :D


-----------------------------------
soplo
Domingo, 23 Enero 2011, 17:49

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
Pues no has buscado mucho.

Aquí tienes la entrada en la wikipedia que lo describe y las RFC correspondientes donde puedas obtener toda la información posible

[url=http://es.wikipedia.org/wiki/OpenDocument]el formato odt


-----------------------------------
Erik
Lunes, 24 Enero 2011, 04:56

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
[quote user="soplo" post="7693"]Pues no has buscado mucho.

Aquí tienes la entrada en la wikipedia que lo describe y las RFC correspondientes donde puedas obtener toda la información posible

[url=http://es.wikipedia.org/wiki/OpenDocument]el formato odt[/quote]

Hola gracias por responder, pues la verdad es que si estoy muy verde en esto, ni se que son las RFC  :oops:
Cheque un poco lo que me enviaste no crei que tenia que usar xml (supongo ha de ser muy facil), pero lo leere despues con mas calma ahorita ya entre a la escuela y no me queda mucho tiempo libre, este trabajo era para hace 1 semana casi  :shock: . En fin termine usando el ejemplo de .csv para por mientras guardar la info de las ventas, la verdad es bastante sencillo pero me queda una duda, hice esta prueba y lo guarda a la perfeccion 

PUBLIC SUB Guardar()
    DIM fic AS File
  
    OPEN "/home/Erik/Escritorio/prueba.csv" FOR WRITE CREATE AS #fic
    PRINT #fic, "hola1, hola2 \n hola3, hola4"
    CLOSE #fic
END

pero ahora si quiero usar el mismo archivo pero escribir al final del documento se podra?, solo necesito esa instruccion para hacer un solo documento por dia

Por otro lado jugando con el codigo hice esto

PUBLIC SUB Guardar()
    DIM fic AS File
  
    OPEN "/home/Erik/Escritorio/prueba.ods" FOR WRITE CREATE AS #fic
    PRINT #fic, "hola1 \t hola2 \n hola3 \t hola4"
    CLOSE #fic
END

tambien lo guarda bien como .ods pero sigue abriendo el importador, esto ya es por curiosidad pense que seria asi de facil hacer un .ods sin tanto rollo del xml, no es que no quiera investigar pero ahorita no tengo mucho tiempo libre, en mis proximas vacaciones seguire aprendiendo, pero de momento seria una super ayuda saber como ir al final de un documento .csv gracias de nuevo


-----------------------------------
Erik
Lunes, 24 Enero 2011, 05:39

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
gracias, ya lo encontre, solo hay que cambiar CREATE por APPEND y lo agrega al final, que bien ya con esto podre dormir tranquilo jejeje, bueno solo queda estudiar xml, en cuanto consiga crear mi archivo .ods directo lo subire aqui y a otro tema que abri hace poco, nos leemos luego


-----------------------------------
soplo
Lunes, 24 Enero 2011, 05:53

Re: Pastear Un Gridview A Una Hoja De Cálculo
-----------------------------------
xml es un coñazo. Yo no tengo ni idea. Algún día tendré que meterme con él porque no queda mas remedio pero tómatelo con paciencia y si decides meterte en ello ya te preguntaré yo je je je.

Siempre dicen que es muy fácil, pero será que lo que me explicaron lo hicieron muy mal pero vamos que hace años que sé que tendré que meterme en ello pero como hasta ahora no me ha hecho falta pues ni tan mal.

 :mryellow:

Por cierto que las RFC son muy importantes (aunque son un ladrillo de cuidado). Una RFC es un estandar que define como se hace algo. Por ejemplo una tarjeta de ted es ethernet 802.1 si cumple el estandar RFC 802.1. Un gráfico es PNG si cumple el estandar PNG. Todos los editores gráficos que quieran trabajar con PNG deberán atenersea  esas normas. Todo así. Por eso si tu quieres saber como funciona ODT lo suyo es mirar eso. Lo que pasa es que ahí se describe todo y es una pelmada. Normalmente hay que ir a buscar que es lo que te interesa que en tu caso es como se almacenan los datos para que otra aplicación pueda abrirlos correctamente.

Por ejemplo hace tiempo hice un programa que sirve para meter un texto oculto en una imagen sin que se note nada. Para saber como funcionan los PNG miré ese estandar y encontré algo que me valió así que hice el programa con eso. Quedó muy chulo je je je.


