Eliminar la protección en archivos Excel

En muchos entornos la utilización de archivos Excel para el envío de datos es un estándar, a pesar de sus grandes desventajas. Además, es habitual que protejamos los mismo con una contraseña para evitar que sean modificados por otros usuarios. Obligándonos a introducir la contraseña para eliminar la protección en archivos Excel y poder realizar cualquier cambio. Debido a la cantidad de archivos de este tipo que manejamos es habitual olvidar la contraseña de algunos, de modo que nos quedamos con un archivo que no podemos modificar.

Eliminar la protección de un archivo Excel es una tarea relativamente sencilla que se puede realizar manualmente o automatizar. En esta entrada explicaré como eliminar la protección manilamente y al final dejaré un script de Python que permite automatizar la tarea.

Error al modificar un archivo Excel protegido
Error al modificar un archivo Excel protegido

En el caso de que nos olvidemos de la contraseña del Excel no suele se complicado recupérala, ya que estas suelen ser débiles. Pero, cuando no es así, eliminar la protección de estos archivos es relativamente simple. Para hacer esta tarea primero se ha de conocer el formato de los archivos Excel.  

Formato de los archivos Excel

Los archivos con formato xlsx que empela actualmente Excel no son más que una carpeta comprimida en la que se pueden encontrar archivos XML. Esto se puede comprobar simplemente cambiando la extensión del archivo a zip y utilizando un descompresor de estándar. Un ejemplo de lo que se obtiene de puede observar en la siguiente captura de pantalla.

Contenido descomprimido de un archivo xlsx
Contenido descomprimido de un archivo xlsx

Cada una de las hojas del libro es básicamente un archivo XML que se encuentra en dentro de la ruta xl/worksheets. En el ejemplo anterior se pueden observar la existencia de dos hojas: sheet1.xml y sheet2.xml. El contenido de una de ellas se puede ver en la siguiente captura.

Contenido del archivo sheet1.xml
Contenido del archivo sheet1.xml

Hacia el final del archivo se puede encontrar una propiedad sheetProtection en la que se almacena el hash de contraseña (afortunadamente no es la contraseña en texto plano).

Hash de la contraseña en el archivo XML
Hash de la contraseña en el archivo XML

Eliminación de la contraseña del Excel 

Ahora, para desproteger las hojas del libro simplemente se ha de eliminar la propiedad sheetProtection y volver a comprimir la carpeta en un archivo xlsx. El nuevo archivo obtenido de esta forma se puede abrir con Excel y modificar los valores de este. Como se muestra en la siguiente captura, ya no aparece el candado en la pestaña de la hoja indicando que esta esta protegida.

Archivo desprotegido
Archivo desprotegido

Automatización del proceso en Python

El proceso descrito anteriormente para la desprotección de archivos Excel es sencillo pero tedioso. Para facilitar la tare se puede escribir un pequeño script en Phyton que automatiza la tarea.

import shutil
import os
import re
import zipfile


def unprotect_xlsx(excel_file, surname='_unprotect', temporal_folder='.temp_folder'):
    zip_ref = zipfile.ZipFile(excel_file, 'r')
    zip_ref.extractall(temporal_folder)
    zip_ref.close()

    sheet_folder = os.path.join(temporal_folder, 'xl/worksheets')
    sheet_list = os.listdir(sheet_folder)

    for sheet in sheet_list:
        filename = os.path.join(sheet_folder, sheet)

        if os.path.isfile(filename):
            file = open(filename, 'r')
            data = file.read()
            file.close()

            data = re.sub(r"<sheetProtection.*?/>", "", data)

            file = open(filename, 'w')
            file.write(data)
            file.close()

    out_file = excel_file.replace('.xlsx', surname + '.xlsx')

    shutil.make_archive(out_file, 'zip', temporal_folder)
    shutil.move(out_file + '.zip', out_file)
    shutil.rmtree(temporal_folder)

En la función unprotect_xlsx lo primero que se hace es descomprimir el archivo Excel en una carpeta temporal. En el interior de esta carpeta se buscan todos los archivos XLM que se encuentran dentro de la ruta xl/worksheets. Posteriormente se itera sobre estos archivos eliminado la propiedad sheetProtection cuando esta existe y volviendo a guardar el archivo. Finalmente, se comprime la carpeta con en un archivo zip al que se le cambia la extensión a xlsx.

Conclusiones

En muchas ocasiones protegemos archivos Excel con una contraseña para evitar que otros usuarios los modifiquen. En el caso de olvidar esta contraseña eliminar la protección no es demasiado complicado.

Imágenes: Pixabay (TheDigitalArtist)

Sin votos
Por favor espera...
Etiquetas:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *