Trabajando con Excel desde Delphi

Hace algunos días me encontré con un problema, que creo yo, es bastante inusual: necesitaba buscar archivos de excel contenidos en un directorio cualquiera (y también en sus subdirectorios si correspondía), abrir los archivos y ver si había algun dato en la celda A2. Si esa celda estaba vacía debía borrarla y sino, mantenerla.

Para hacer ese trabajo tenía disponible un archivo de Excel con una macro que hacía lo mismo, el problema era que abría los archivos usando un path definido en el código. Es decir, los archivos de excel y los directorios debían de tener una estructura definida para que funcione correctamente. Además, la macro estaba levemente “vieja” ya que nuevos archivos de Excel, que generaba una sintaxis de SPSS, no los borraba porque simplemente no estaban definidos en la macro.

Así se me ocurrió escribir en Delphi código que me permita buscar todos los archivos en un directorio dado y luego, abrirlos uno por uno e ir borrando los que están vacíos.

Comencé por lo primero: buscar los archivos de excel. Primero hice una búsqueda para asegurarme de que no estoy reinventando nada, y me encontré este procedimiento escrito por Germán Estévez (Neftalí) que me cayó como anillo al dedo. El procedimiento te permite definir un directorio inicial, un file mask (o máscara de archivos, es decir, el “*.xls”), definir si hacer la búsqueda recursiva (es decir, si también debe buscar en los subdirectorios) y por último, se le pasa como referencia un TStrings (en mi caso, un TListBox donde se lista los archivos encontrados). El código del que hablo lo puedes encontrar aquí.

Lo siguiente: ver qué archivos estaban “vacíos” (teniendo la premisa anterior) y borrarlos. Después de investigar un poco, pude escribir código que ya hacía lo que quería. En un botón “Borrar archivos” (por darle un nombre), programé lo siguiente:

if ( lbArchivos.Count > 0 ) then
begin
if ( Application.MessageBox(
‘Desea agregar los nuevos archivos encontrados a la lista?’,
‘Nueva búsqueda’,
MB_ICONQUESTION + MB_YESNO) = idNo ) then
lbArchivos.Clear;
end;
FindFiles(GetCurrentDir, ‘*.xls’, cbRecursivo.Checked, lbArchivos.Items);

Primero le preguntamos al usuario si desea agregar los nuevos archivos encontrados a la lista (si la lista no está vacía). Si no quiere, borramos. Luego, le pasamos los datos de referencia al procedimiento: GetCurrentDir (que previamente definí a usando un TShellTreeView), defino la máscara *.xls (todos los archivos de excel), si es recursivo (que utiliza una opción en el menú) y finalmente, el ListBox.

Una vez que tenemos nuestro listbox con el path y el nombre del archivo de excel ya completados, sólo nos queda recorrer cada uno de los archivos y borrar aquellos que están “vacíos”.

En un botón borrar programamos lo siguiente:

// hay archivos de control en la lista?
if ( lbArchivos.Count > 0 ) then
// contador de cantidad de archivos de control borrados
counter := 0;

// creamos una nueva instancia de excel y lo hacemos invisible
// to-do: ver como mejorar esto, tarda demasiado y a veces se cuelga!!!
XLApp := CreateOleObject(’Excel.Application’);

// “ocultamos” al excel para que no el usuario no vea como se abren
// y se cierran los archivos
XLApp.Visible := false;

// por cada archivo en la lista
for i:=0 to lbArchivos.Count - 1 do
begin
// abrimos el archivo de control
XLApp.WorkBooks.Open(lbArchivos.Items[i]);
{
Recuperamos el valor contenido en la celda A2 del
archivo de control
Si la celda esta vacía, retorna UnAssigned y la borramos
}
Celda := XLApp.Range['A2'].Value;
// cerramos el archivo
XLApp.WorkBooks.Close;
// si la celda A2 está vacía
if VarIsEmpty(Celda) then
begin
// si se borra correctamente
if DeleteFile(lbArchivos.Items[i]) then
begin
// incrementamos el contador
counter := counter + 1;
end
else
// si no se borra correctamente, avisamos
memLog.Lines.Add(lbArchivos.Items[i] +
‘ no se borro! / Código del error: ‘ +
IntToStr(GetLastError));

end;
end;

// cerramos la instancia creada de excel
if not VarIsEmpty(XLApp) then XLApp.Quit;

Como podrán ver, básicamente recorremos cada item del ListBox, y por cada uno de ellos abrimos el archivo utilizando el XLApp.WorkBooks.Open(), recuperamos el valor de la celda A2 y si la variable Celda (en donde guardamos el contenido de A2) está vacío, borramos el archivo.

Adicional a esto incluí cosas como un ProgressBar para que el usuario sepa el progreso del trabajo, un objeto Animate que mientras recorre el ListBox va mostrando una animación y cambié el cursor de la pantalla a crHourGlass para que el puntero no parpadee mientras se cierran y abren los archivos.

Incluí además, como ya mencioné, un TShellTreeView para que el usuario puede ver el árbol del sistema de archivos, pero después de trabajar unos días con él no pude hacer con él todo lo que quería, ya que su propiedad IsFolder (es directorio/carpeta), me retornaba como verdadero cuando seleccionaba por ejemplo Mis sitios de red, pero asumo que ha de ser esto correcto (digo). Aún no lo conozco del todo, pero, es muy útil para recorrer el árbol de directorios de la pc.


1 comentario hasta ahora, quieres decir algo?

  1. fausto fabian garcete dijo:

    Deja un ejemplo de de tu explicacion, asi queda muy en el aire, demasiado esfuerza para nada, hace un enlace subi tu archivito y tiempo y dedicacion no habra sido en vano. Gracias!!!

Dejá tu comentario

playa / mar del plataplaya / mar del platagustavo y yoplaya / mar del plataplaya / mar del plataplaya / mar del plataplaya / mar del plataplaya / mar del plataplaya / mar del plataplaya / mar del plata