Hola sufridos programadores de ABAP:
Es difÃcil tener la ocasión de escribir “SAP” y “glamour” en la misma frase, a pesar de esta misma.
Esto es especialmente cierto a la hora de exportar ALVs como excel, sobretodo desde versiones antiguas de R/3, pues los resultados son horrorosos a la vista. Y aunque tampoco es la única manera que existe de generar hojas de cálculo desde R/3, ya que tenemos clases ABAP dedicadas, en este caso tenemos que hablar de fealdad a la hora de programarlas.
Si además queremos construir excels un tanto complejos con fórmulas, diversidad de titulares, disposiciones no estrictamente tabulares, etc…, etc… entonces estamos en un auténtico aprieto.

Para resolver todo esto presento la librerÃa zvcExcel que, aunque no está todo lo acabada que me gustarÃa, en su forma actual ofrece muchas posibilidades, siendo su mejor baza el enfoque de programación que soporta, muy cercano, en el fondo, al del usuario de Office.
Un humano, a la hora de generar hojas de cálculo, se dedica a mover el cursor e ir rellenando allà donde le apetece o le parece más adecuado, gozando de mucha libertad a la hora de hacer el diseño. Un programa, sin embargo, por lo general sólo se limita a rellenar filas y columnas de datos con una lÃnea de cabecera y gracias.
zvcExcel utiliza una especie de cursor que podemos “mover” libremente (utilizando un lenguaje de macros) rellenando las casillas que nos interesan, dotándolas asà de diferente estética, contenidos… y ¡hasta de fórmulas!
Mientras que lo habitual a la hora de totalizar o realizar cálculos en la exportación de éxceles es incrustarlos a piñon en el resultado, zvcExcel permite que introduzcas auténticas fórmulas de excel para que el usuario final, si lo desea, pueda modificar valores en la hoja resultante sin que las cifras se descuadren.
Lo mejor para entender cómo funciona la librerÃa es leer este código de ejemplo, que es el que genera el gráfico de arriba y está ampliamente comentado. Lo único que precisa para funcionar es el include que al final de este artÃculo adjunto, junto con este mismo programa, en un zip:
REPORT zvcexcel_ejemplo.
INCLUDE zvcexcel.
DATA it_excel TYPE TABLE OF vcxt_excel.
DATA it_ekpo TYPE TABLE OF ekpo WITH HEADER LINE.
START-OF-SELECTION.
SELECT *
FROM ekpo
INTO TABLE it_ekpo
UP TO 10 ROWS
WHERE netpr NE 0
AND menge NE 0
AND txz01 NE space.
* COMIENZA LA GENERACIÓN DEL EXCEL
* refrescamos nuestra tabla it_excel, que hemos definido nosotros.
REFRESH it_excel.
* este macro borra las definiciones anteriores y establece un estilo
* de texto por defecto para toda la hoja, y sitúa el cursor en A1
vcx_initialize.
* este macro hace que cada vez que ejecutemos VCX_CELLVAL, el cursor
* avance una casilla en horizontal. con VCX_AUTOXINC_OFF desactivamos.
vcx_autoxinc_on.
* empezamos a definir la estética. es necesario saber CSS
* en algunos casos, como ciertas fórmulas, deberemos investigar
* los CSS propios de microsoft, que comienzan por mso-
vcx_classcss 'titulo' 'font-family:impact;font-size:24px'.
vcx_classcss 'cabeza' 'font-weight:bolder;font-size:14px;' &
'background-color:#660000;color:#ffffff'.
vcx_classcss 'numero' 'color:#ff9900;font-size:12px;' &
'font-weight:bolder'.
vcx_classcss 'total' 'font-size:14px;border-top:1px #000000 solid'.
* definimos la clase fecha, para campos tipo datum, utilizando
* un valor por defecto de la librerÃa
vcx_classcss 'fecha' vcxdefaultdateformat.
* vamos a cargar la primera celda de tÃtulo.
* le asignamos una estética ANTES de dar valor
vcx_cellclass 'titulo'.
* fusionamos 6 celdas en horizontal para que quepa bien el tÃtulo
vcx_cellspan 6.
* y al final le damos valor. debido a VCX_AUTOXINC_ON avanza el cursor
vcx_cellval 'ejemplo de excel generado con zvcExcel'.
* salto de lÃnea
vcx_crlf.
* la celda de abajo la usaremos de comentario y tomará estética defecto
vcx_cellval 'un tanto elemental'.
vcx_crlf.
* esta instrucción hace que TODAS las celdas definidas a partir de ahora
* tengan estética tipo 'cabeza'.
vcx_autoclass 'cabeza'.
vcx_cellval 'Pedido'.
vcx_cellval 'Pos.'.
vcx_cellval 'Concepto'.
vcx_cellval 'Fecha'.
vcx_cellval 'Cant.'.
vcx_cellval 'Un.'.
vcx_cellval 'Precio'.
* con space desactivamos la clase 'cabeza'.
vcx_autoclass space.
vcx_crlf.
* internamente no se trabaja en formato A1 tÃpico excel, sino con
* coordenadas x,y type i. vcx_x y vcx_y recogen en todo momento las
* coordenadas actuales del cursor.
* filainicio y filafin nos servirá para delimitar el rango de una suma
DATA filainicio TYPE i.
DATA filafin TYPE i.
filainicio = vcx_y.
* un vulgar loop nos permite rellenar la hoja rápidamente
LOOP AT it_ekpo.
vcx_cellclass 'numero'.
vcx_cellval it_ekpo-ebeln.
vcx_cellval it_ekpo-ebelp.
vcx_cellval it_ekpo-txz01.
vcx_cellclass 'fecha'.
vcx_cellval it_ekpo-aedat.
vcx_cellval it_ekpo-menge.
vcx_cellval it_ekpo-meins.
vcx_cellval it_ekpo-netpr.
vcx_crlf.
ENDLOOP.
* como al final hay un salto de lÃnea, restamos uno para rango de suma
filafin = vcx_y - 1.
* vamos a poner la fila de totales con una raya encima
vcx_autoclass 'total'.
* desplazamos el cursor a la derecha hasta la columna F
DO 5 TIMES.
vcx_cellval ''.
ENDDO.
* también podrÃamos haber utilizado VCX_XINC que mueve cursor a derecha
* escribimos la leyenda para el total.
vcx_cellval 'SUMA:'.
* la siguiente instrucción nos va a meter en la celda la fórmula
* =SUMA(G4:G53)
* aunque nosotros lo hacemos como si dijeramos (7,4):(7,53) y no G4:G53
vcx_cellsum 7 filainicio 7 filafin.
vcx_cellval space.
* en este ejemplo VCX_CELLFORMULA, más complicado: permite introducir
* cualquier fórmula siempre que sea en el formato interno de excel, en
* el que el nombre de las funciones no es el español. también debemos
* utilizar coordenadas alfanuméricas y no numéricas. no es problema:
* si queremos convertir una coordenada x en letras,
* lo haremos con VCX_NUMBER2ALFA. no hay lÃmite más allá que
* el del propio excel.
* del mismo modo, VCX_COORDS2ALFA convierte (x,y) en formato A1. si uno
* de los valores es 0, lo transforma en totalidad de fila o columna
* ejemplo: ncoords2alfa 4 3 valor. hace valor = 'D3'.
* ejemplo: ncoords2alfa 4 0 valor. hace valor = 'D'.
* aunque aquà ya no harÃa falta, desactivamos la clase 'total'.
vcx_autoclass ''.
* generamos el excel dentro de la tabla
vcx_excelgenerate it_excel.
* y lo descargamos localmente.
vcx_exceldownload it_excel 'c:prueba.xls'.
* importante: si excel ya tiene abierto el fichero, no lo podremos
* descargar.
* otros macros están descritos dentro de la librerÃa y no
* necesitan mucha explicación
Lo único que lamento de esta librerÃa es el hecho de que todavÃa no está lo suficientemente completa para mi gusto, puesto que las posibilidades de ampliación son enormes. Pero no dudo que lo iré haciendo a medida que necesite funcionalidades.
Como siempre, recomiendo el uso de esta librerÃa siempre que se respete la autorÃa, el link a este glob, etc… y animando a aquellas personas que decidan ampliarla a compartir su trabajo tras hacerlo.
Podéis descargar el include zvcExcel y el programa de ejemplo aquÃ.



9,67 [6 votos]
9,00 [10 votos]














