Página 1 de 1

[RESUELTO] Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 4:45 pm
por Dario Piedra
Buenos días estimados,

Estaba tratando de copiar un rango de celdas de un libro, a otro libro usando easy macro. (usando OpenOffice 4.1.3 32bit)
Mi código es el siguiente:
Código: Seleccionar todo   Expandir vistaContraer vista
from libo import LIBO

app = LIBO()

def main():
   doc_origen = app.get_doc('Origen.ods')
   hoja_origen = doc_origen.active
   rango_origen = hoja_origen['A1:A4']
   #hay algunos msgbox (bastantes) es para confirmar que cada dato seleccionado sea correcto.
   app.msgbox(doc_origen.title) #muestra el libro correcto.
   app.msgbox(hoja_origen) #resultado mostrado es = Libo.LOCalcSheet object at 0x0FDC7990
   app.msgbox(rango_origen.address)#muestra el rango correcto.
   
   doc_destino = app.get_doc('Destino.ods')
   hoja_destino = doc_destino.active
   app.msgbox(doc_destino.title) #muestra el libro correcto.
   app.msgbox(hoja_destino) #resultado mostrado es = Libo.LOCalcSheet object at 0x0FDC7DF0
   celda_destino = doc_destino.sheets['1']['A1'].get_next_cell()
   app.msgbox(celda_destino.address) #Si uso .get_next_cell() muestra el segundo error adjunto.
   rango_origen.move(celda_destino)
   
   return
   

Si realizo un cambio y en la celda_destino no uso la sentencia .get_next_cell(), me muestra la celda seleccionada de forma correcta pero el error se refleja al momento de ejecutar la sentencia rango_origen.move(celda_destino)

Código: Seleccionar todo   Expandir vistaContraer vista
   celda_destino = doc_destino.sheets['1']['A1']
   app.msgbox(celda_destino.address) #Muestra la hoja y celda correcta.
   rango_origen.move(celda_destino)#Aquí se muestra el primer error adjunto.


Por lo que pude ver en el error creo que hace referencia al siguiente atributo:
Código: Seleccionar todo   Expandir vistaContraer vista
    def __getitem__(self, index):
        if PY2:
            return self._get_item(index)
        return LOCalcSheet(self._obj[index])


Agradezco la ayuda que me puedan brindar para identificar el error.

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 5:35 pm
por mauricio
Hola...

Ya vi mi error... el problema es que OpenOffice no soporta aun la referencia directa por indice (slice), creí que ya lo había resuelto, pero me falto esa línea... lo arreglamos en un rato...

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 5:55 pm
por Dario Piedra
Comprendo Mauricio,

Estaré atento, te agradezco de antemano la ayuda.

Saludos.

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 6:20 pm
por mauricio
Listo, he probado el mover en OpenOffice... pero acabo de caer en la cuenta que ahora LibreOffice usa primeros las filas y luego columnas, y OpenOffice usa primero columnas y despues filas para referirse a rangos... espero haber validado en todos los casos...

Por favor, actualiza y prueba nuevamente.

Saludos

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 7:14 pm
por Dario Piedra
Muchísimas gracias Mauricio, muy amable.
Efectivamente ya no se muestra el error, sin embargo tengo una duda:

Código: Seleccionar todo   Expandir vistaContraer vista
def main():
   doc_origen = app.get_doc('Origen.ods')
   hoja_origen = doc_origen.active
   rango_origen = hoja_origen['A1:A4']
   
   doc_destino = app.get_doc('Destino.ods')
   hoja_destino = doc_destino.active
   celda_destino = doc_destino.sheets['1']['A1']

   rango_origen.move(celda_destino)
   return

Según yo, el código debería escoger el rango de celdas 'A1:A4', del libro y hoja de origen, y pegarlo en la celda 'A1', de la hoja '1' del documento de destino.
Sin embargo cuando lo ejecuto solo hace esto:
1- Desaparece la celda 'A1' del libro de origen.
2- No aparece nada en la celda 'A1' del libro destino.

Probé cambiar el rango por este formato: (col:fil, col:fil)
Código: Seleccionar todo   Expandir vistaContraer vista
rango_origen = hoja_origen[0:0, 0:3]

Sin embargo al hacer ese cambio, obtuve el error adjunto.

Te agradezco la ayuda que me puedas brindar,

Saludos.

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 7:54 pm
por mauricio
Si tienes:
Código: Seleccionar todo   Expandir vistaContraer vista
   hoja_destino = doc_destino.active
   celda_destino = doc_destino.sheets['1']['A1']

Entonces ya deberías de tener hoja_destino, por lo que celda_destino debe quedar:
Código: Seleccionar todo   Expandir vistaContraer vista
celda_destino = hoja_destino['A1']

pero si seleccionas otros documento que NO es el activo, mi recomendación es que uses referencia directa a la hoja, y no a la activa:
Código: Seleccionar todo   Expandir vistaContraer vista
celda_destino = doc_destino.sheets['1']['A1']

Toma nota de que estas referenciando la hoja que se llama '1', por que estas usando las comillas, si quieres hacer referencia a la hoja 1 (recuerda que empiezan en cero), entonces pasalo como un entero, sin las comillas.
Código: Seleccionar todo   Expandir vistaContraer vista
celda_destino = doc_destino.sheets[1]['A1']

Pruebas y nos cuentas...

Saludos

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 8:19 pm
por Dario Piedra
Buenas tardes Mauricio,

Probé con los cambios que me indicas dejando del código de esta forma:

Código: Seleccionar todo   Expandir vistaContraer vista
def main():
   doc_origen = app.get_doc('Origen.ods')
   hoja_origen = doc_origen.active
   rango_origen = hoja_origen['A1:A4']
   
   doc_destino = app.get_doc('Destino.ods')
   #hoja_destino = doc_destino.sheets[0] #estas líneas están comentadas para poder
   #celda_destino = hoja_destino['A1']#probar con la línea de abajo. en mis pruebas utilicé las dos formas.
   celda_destino = doc_destino.sheets[0]['A1']

   rango_origen.move(celda_destino)
   return


El resultado es el mismo, desaparece la primera la celda ['A1'] del documento origen, y no aparece nada en el documento destino.
Hice adicional las siguientes pruebas:
Cambie celda destino por este valor:
Código: Seleccionar todo   Expandir vistaContraer vista
celda_destino = doc_destino.sheets[0]['A6']


Y el resultado es el siguiente: movió las celdas ['A2:A4'] a las posiciones ['A6:A8'], esto en la misma hoja del libro origen. (es decir, las movió de campo dentro del mismo libro y la misma hoja. La celda ['A1'] se quedó donde estaba.
Adicional está el problema de no poder seleccionar rangos en formato [col:fil, col:fil]

Saludos.

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 8:29 pm
por mauricio
Ya veo... mover celdas solo funciona entre hojas del mismo libro, así funciona el método tanto de LibreOffice como de OpenOffice... para mover celdas entre libros, realmente lo que hay que hacer:

1.- Obtener los datos origen
2.- Copiarlos al destino
3.- Eliminar el origen

Por supuesto, la idea de Easy-Macro es facilitar las cosas, voy a validar si el origen y destino son diferentes archivos y actuar en consecuencia, de este modo, podemos dejar el método como esta y le damos el plus que buscamos.

Estén al pendiente.

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 8:33 pm
por Dario Piedra
Interesante, entonces la limitante es del mismo software.

En ese caso el método para copiar de un libro a otro sería el método copy_data?
Esto lo pregunto porque adicional al método move, probé el método copy y tuve el mismo resultado, copió la información en la misma hoja y libro de origen.

Saludos.

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 8:35 pm
por mauricio
Así es, pero con Easy-Macro, lo vamos a mejorar... espera mis noticias...

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 8:38 pm
por Dario Piedra
Quisiera tener más conocimiento para apoyar más... Gracias nuevamente por toda la ayuda brindada.
Estaré atento.

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 8:46 pm
por mauricio
Primera prueba... actualiza la librería y pruebas con el siguiente código:
Código: Seleccionar todo   Expandir vistaContraer vista
    origen = app.get_doc('Origen.ods').sheets[0]['A1'].current_region
    destino = app.get_doc('Destino.ods').sheets[0]['A1']

    destino.data = origen.data
    origen.clear()

Lo he probado en OpenOffice y mueve los datos correctamente entre los libros...

Saludos

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 8:58 pm
por mauricio
Ya me acorde que para eso eso hice el copy_data, he validado en OpenOffice...
Código: Seleccionar todo   Expandir vistaContraer vista
    origen.copy_data(destino)
    origen.clear()

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 9:01 pm
por Dario Piedra
Es una completa maravilla.
Y lo mejor, si deseo mantener el origen por temas de "respaldo", basta solo con no agregar la sentencia:
Código: Seleccionar todo   Expandir vistaContraer vista
origen.clear()


Mauricio, increíble la ayuda, realmente agradecido.

Re: Error al copiar rango. Easy Macro.

NotaPublicado: Sab Jul 29, 2017 9:10 pm
por mauricio
Gracias por validar... esto nos permite tener una librería madura y lista para producción...

Saludos

P.D. No olvides marcar como resuelto