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 :)
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:
VFPExcel2007Functions.zip (19,14 KB)
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.