26 de julio de 2009

Usando formatos de archivos de Excel 2007 en VFP 9.0

Artículo original: Using Excel 2007 File Formats in VFP 9.0
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,6b9d4c6f-76bb-4444-8d5b-9e321c605534.aspx
Autor: Craig Boyd
Traducido por: Luis María Guayán

Los Problemas

Los comandos APPEND FROM y COPY TO de Visual FoxPro 9.0 son incompatibles con los nuevos formatos de archivo de Excel 2007 (XLS, XLSX, xlsb, y XLSM). Habrá notado que incluí XLS y usted cree que es soportado, pero sólo intente guardar su libro XLS Excel 97-2003 en el modo de compatibilidad de Excel 2007 y, a continuación, utilice el comando APPEND FROM sobre éste. VFP se quejará de la validez del archivo, en resumen, no funciona. Y, el comando COPY TO esta simplemente atascado en los oscuros años del XLS y XL5 disponibles. Bien, entonces todo esto es el primer problema.

El segundo problema con los comandos APPEND FROM y COPY TO es que no permiten especificar las columnas o los campos; una cláusula WHERE o FOR; o especificar un rango o área de impresión. Estamos bastante atascados con especificar un libro, APPEND FROM permite un parámetro opcional para la Hoja, pero eso no es adecuado ni super atractivo.

El tercer problema es que la solución habitualmente sugerida para los problemas de arriba, es utilizar automatización, y la automatización es super lenta debido al consumo efectuado por COM. Esto también introduce una dependencia adicional de tener instalado Excel 2007 en la máquina en la que el código se ejecuta. Lo "lento" nunca es aceptable (las aplicaciones VFP puede tener sus cosas, pero la lentitud no es una de ellas) y la dependencia adicional, aceptable en algunos casos, es un freno si se están ejecutando estos tipos de operaciones sobre un servidor web que no tiene instalado Excel 2007.

La Solución

Yo estaba trabajando en una solución para un cliente mío, que requería que consuma y cree archivos XLS, XLSX, xLSB y XLSM, sin que el usuario necesite tener instalado Excel 2007. Después de lanzar unas pruebas conjuntamente, yo incluí la ayuda de mi amigo Bo Durban. El código proporcionado en un archivo .ZIP al final de este artículo, es lo que surgió después de un par de intensas sesiones de codificación. Un agradecimiento especial a mi cliente por permitir compartirlo.

El Código

El código incluye 2 funciones principales: AppendFromExcel() y CopyToExcel(). También hay 4 funciones de ayuda: AWorkSheets(), AWorkSheetColumns(), CreateExcelTemplate(), y EmptyFieldToNull() que le puede resultar útil o interesante. El código:
  • No requiere de Office 2007
  • Pueden añadir de formatos de archivo xls, xlsx, xlsm, y xlsb
  • Puede crear y copiar a los formatos de archivo xls, xlsx, xlsm, y xlsb
  • Soporta todas las tablas de Excel (hojas de trabajo, rangos, áreas de impresión)
  • Permite que las columnas de la hoja de cálculo y los campos de las tablas puedan ser especificados
  • Permite que la cabecera de la fila en la hoja de trabajo pueda contener espacios en los nombres de las columnas, encerrándolos entre corchetes, por ejemplo [Mi Columna # 1]
  • Proporciona soporte para expresiones con cláusulas WHERE de SQL o cláusula FOR de VFP
  • Es super rápido
  • Probablemente hace algunas otras cosas que no estoy pensando ahora :)
De todas formas, descargue y descomprima el PRG, descomente y/o modifique el código del ejemplo de uso de la parte superior del PRG a su gusto, y diviértase!

Originalmente incluí el código en la parte inferior de este artículo, pero el código hacía locuras con el ancho de este blog, porque contiene algunas líneas muy largas con binarios. Por lo tanto, aquí está el vínculo para la descarga del archivo PRG que contiene las cosas que necesita:

Nota: Adicionalmente una reestructuración del código (refactoring) es necesaria, y definitivamente esto clama por una clase que se deba construir, pero el código funciona completamente como está.
Si tienen algún problema ejecutando el código (especialmente si aparece el diálogo de Seleccionar un origen de datos) es posible que deba comprobar el proveedor OLEDB y observar las alternativas proporcionadas en el código.

5 comentarios :

  1. Excelente trabajo, muchas gracias...

    ResponderBorrar
  2. Intente usar CopyToExel pero no me dio ningún resultado. Entiendo que a partir de los que tienes en una tabla se genera por ejemplo un XLSX. Pero no me funciono. No se si sera Oledb provide el problema. saludos

    ResponderBorrar
  3. Tuve que instalar Microsoft Office para que la función CopyToExcel funcionara, de lo contrario falla al abrir la conexión con Provider=Microsoft.ACE.OLEDB.12.0

    ResponderBorrar
  4. Hola, no puedo descargar el archivo

    ResponderBorrar
  5. Hola, no pude descargar el archivo

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.