miércoles, 22 de octubre de 2008

[Colaboración de Lucas Gutiérrez Jaramillo - Ceiba Software House] Cambiar el color de las celdas de Excel desde PeopleNet

Lucas Gutiérrez Jaramillo de Ceiba Software House (http://www.ceiba.com.co/), me ha enviado la información necesaria para crear un post que creo que os resultará muy interesante. Se trata de poder cambiar propiedades de celdas de un Excel desde una regla LN4 de Meta4 PeopleNet, en este caso el color.

Antes de empezar es muy recomendable que leais también el post Macros Excel en LN4.

Lo primero consiste en heredar el objeto de Excel, para no trabajar sobre el original, luego se creará una nueva estructura de nodo para obtener el objeto "Interior" de la celda a la que queremos colorear. Esta estructura estará ubicada dentro de un nodo hijo del nodo EXCEL_CELLS, ya que este dependerá de la celda seleccionada. Esta estructura se llamará CCB_EXCEL_INTERIOR.


Estructura final, con métodos y propiedades


La nueva estructura debe conectarse con las su padre de la siguiente manera para que las referencias sean correctas.


Conectores

Las estructuras deben tener una propiedad para apuntar a cada nivel según su jerarquía en el árbol del objeto por cada nivel se agrega un grandparent (abuelo) mas.

Una vez teniendo la estructura correctamente se crean los métodos para la obtención del objeto "Interior". Estos dos métodos son: GETINTERIOR y GETINTERIORINT

GETINTERIOR es un metodo del tipo LN4, que crea un nuevo registro y luego llama al método GETINTERIORINT que es el que realmente hace el llamado al objeto de Excel. A continuación se ilustra como es este método:


Método GETINTERIOR


Código de GETINTERIOR

GETINTERIORINT es el wrapper (envolvente) del método de la dll que hace el verdadero llamado a Excel para obtener el objeto Interior. Este método hace el llamado a la función GetObjectFromProperty. Esta función obtiene el objeto Interior de la propiedad Interior (Llevan el mismo nombre) del objeto Range, el cual es el tipo de objeto que se obtiene desde PeopleNet al llamar el metodo EXCEL_CELLS.GetCell(x,y) del objeto Excel. Según esto, primero se debe llamar obtener la celda (Objeto Range en Excel) y luego obtener el interior de la celda (Objeto Interior en Excel).

Método GETINTERIORINT

Código de GETINTERIORINT

Por último el método COLORINDEX, este método es el wrapper del método de la dll que cambia la propiedad ColorIndex del objeto Inerior. Este método en la dll se llama OLE_Property, este hace el llamado a la propiedad según el nombre del método, por eso el método debe llamarse igual que la propiedad que se desea modificar (No es case sensitive). Si se deseara modificar otra propiedad de este objeto simplemente se crea el método con el nombre de la propiedad que se desea modificar. Se debe tener en cuenta que si esta propiedad es un objeto, debe obtenerse el objeto de la misma manera que se obtiene el objeto Interior, y no puede asignarse directamente.

Método COLORINDEX

Código de COLORINDEX

Por último, Lucas comenta: "mucho de lo que se dice en este post son conclusiones obtenidas sobre la marcha al momento de implementar esta funcionalidad, todas basadas en mi trabajo anterior en interacciones con Excel desde otras aplicaciones, y en como hasta ahora he visto que se trabaja en PeopleNet. Es así como pueden estar erróneas y si es del caso estoy abierto a que cualquiera que conozca el verdadero funcionamiento me corrija.

Espero que les sea útil."
SEGURO QUE LO ES... Mucha gracias Lucas

15 comentarios:

Anónimo dijo...

Gracias por los ocmentarios y por el post.

En mi caso realice toda la estructura y tengo luego algo como esto:

RARAM1 = "NOMBRES"
EXCEL!EXCEL_CELLS.GetCell(fila,12)
EXCEL!EXCEL_CELLS.Value(RARAM1)

A que sentencia se debe hacer referencia y que valor se coloca para por ejemplo colocar esta celda de color amarillo.

Mil Gracias.

MaMBrU dijo...

Despues de obtener la celda con GetCell(x,y), se debe obtener el "INTERIOR" de la celda:

EXCEL!CB_EXCEL_INTERIOR.GETINTERIOR()

Y por último asignar el valor al "COLORINDEX" del "INTERIOR":
EXCEL!CCB_EXCEL_INTERIOR.COLORINDEX(3)

En este caso el 3, es para el color Rojo, no conozco bien la totalidad de indices de colores que maneja, puedes probar con otros numeros hasta que encuentres el amarillo :P

Espero te sirve.

nelrogel dijo...

Ya realice todo este procedimiento.
pero al final cuando agrego en mi regla:
EXCEL!EXCEL_Cells.GetCell(Y,X+3)
EXCEL!EPR_EXCEL_INTERIOR.GETINTERIOR()
EXCEL!EPR_EXCEL_INTERIOR.COLORINDEX(3)
EXCEL!EXCEL_Cells.Value("TOTAL DEL CONCEPTO DE NETOS: ")
EXCEL!EXCEL_Cells.GetCell(Y,X+5)
EXCEL!EXCEL_Cells.Value(TOSTRING(vIMPORTE,2))

al compilar la regla me dice que el metodo colorindex no necesita argumento! que argumentos le tendria que agregar para que me funcione?
Alguien me puede ayudar
Gracias

Anónimo dijo...

Excelente!

nelrogel, agregale un arg tipo numerico al colorindex y asegurate que los métodos y propiedades esten de acuerdo a lo que dice el post y te funcionará.

Saludos y Gracias,

Unknown dijo...

Muchas gracias!

Tengo otra duda.

Si quisiera modificar la fuente a Negritas así como el tamaño y el estilo de fuente que función ocuparía o como le podría hacer para resolver esto ya que en algunos Reportes en Excel que estoy haciendo me piden que ingrese Totales con Negritas.

Muchisimas Gracias por su ayuda.

Saludos

MaMBrU dijo...

Deberias crear una estructura entera que te maneje el objeto fuente (Font), y a este exponerle propiedades de negrita(Bold), indice de color(ColorIndex), etc.

Basicamente es hacer lo mismo que con el objeto interior pero obteniendo la fuente, todo como un hijo de la estructura cells.

Anónimo dijo...

Esto requerirá de un poco de investigación y pruebas, de todas formas, si alguien tiene la respuesta postearla. Gracias.

Anónimo dijo...

ya está funcionando!! son 56 colores los que maneja
1 negro
2 blanco
3 rojo
4 verde
5 azul
6 amarillo
7 rosa
etc etc...

Nadamas como truco para las personas que estan teniendo problemas con los argumentos, reinicien peoplenet!! si te dice que el metodo no requiere argumentos, borra caches y reinicia. Una vez reiniciado te permitirá!!

Anónimo dijo...

No es necesario que crees un M4O y lo heredes...utiliza el mismo ojecto ( EXCEL )...con las siguientes lineas le das color a la celda

EXCEL!EXCEL_CELLS.GetCell(1,1)
EXCEL!EXCEL_CELLS.Value("Sobrecupo por CAPACITACION")
EXCEL!EXCEL_CELLS_BORDERS.GetBorder()
EXCEL!EXCEL_CELLS_BORDERS.GetBorderInt("Interior")
EXCEL!EXCEL_CELLS_BORDERS.ColorIndex(35)...

Saludos.

Jose Luis Nuñez
Guadalajara, Jalisco, Mexico

Anónimo dijo...

Gente, buenas tardes, quizas alguien me pueder echar una mano.
Cuando quiero sacar un reporte de varias empresas, me aparece el siguiente error:

Error (0-27-5) Error en ejecución.
El método externo "OLE_Property" de la biblioteca "oleexec" se ejecutó con errores.
Debe consultar el resto de mensajes.

Error (0-36-11)
El puntero OLE ha dejado de ser válido

Error (0-36-9) Invocación de método/propiedad ha fallado.
El método OLE "Cells" no ha podido ser ejecutado. Error de sistema "-2147024882": "".
Debe revisar la la existencia del método.

Desde ya, muy agradecido.

Anónimo dijo...

Hola, buenos días.
Con respecto al último comentario...¿encontraste la solución?
Si es así, por favor dime cómo lo resolviste, ya que a mí se me esta presentando un error muy similar y no sé cómo resolverlo:

Error (0-27-5) Error en ejecución.
El método externo "OLE_Execute" de la biblioteca "oleexec" se ejecutó con errores.
Debe consultar el resto de mensajes.

Error (0-36-11)
El puntero OLE ha dejado de ser válido

Por favor, si alguno de los comentarista conoce la solución, le agradecería que me aportara su ayuda.

Muchas gracias.

Anónimo dijo...

Hola, buenos días.
Con respecto al último comentario...¿encontraste la solución?
Si es así, por favor dime cómo lo resolviste, ya que a mí se me esta presentando un error muy similar y no sé cómo resolverlo:

Error (0-27-5) Error en ejecución.
El método externo "OLE_Execute" de la biblioteca "oleexec" se ejecutó con errores.
Debe consultar el resto de mensajes.

Error (0-36-11)
El puntero OLE ha dejado de ser válido

Por favor, si alguno de los comentarista conoce la solución, le agradecería que me aportara su ayuda.

Muchas gracias.

Bruno dijo...

Hola, buenas tardes.

Les hago una consulta. Tengo el siguiente problema: cuando utilizo el m4o EXCEL, me genera un proceso de ejecución EXCEL.EXE. Este sigue activo en la cola de procesos del sistema operativo, aún luego de haber terminado con la "tarea".

Existe alguna manera de "matar" el proceso luego de terminar de utilizar el M4O EXCEL?

Si ejecuto n veces el proceso que utiliza el m40 excel me crea N procesos de ejecución en windows...

Les ha sucedido esto? podrán aydarme?

muchas gracias

Anónimo dijo...

Hola, buenas tardes.

Les hago una consulta. Tengo el siguiente problema: cuando utilizo el m4o EXCEL, me genera un proceso de ejecución EXCEL.EXE. Este sigue activo en la cola de procesos del sistema operativo, aún luego de haber terminado con la "tarea".

Existe alguna manera de "matar" el proceso luego de terminar de utilizar el M4O EXCEL?

Si ejecuto n veces el proceso que utiliza el m40 excel me crea N procesos de ejecución en windows...

Les ha sucedido esto? podrán aydarme?

muchas gracias

Gonzalo Serrano dijo...

Buenas tardes,

Excelente BLOG, excelente post, y mis felicitaciones a todos,

Alguien sabe si desde aquí (o desde la nueva API de Excel C++ desde la versión 8) se puede centrar el contenido de una celda?

Muchisimas gracias!
Siempre atento al blog y muy agradecido