Saltar al contenido

¿Crear un archivo de Excel protegido con contraseña usando Apache POI?

Amelia, parte de nuestro staff, nos ha hecho el favor de escribir esta reseña porque controla a la perfección el tema.

Solución:

Actualizado: A partir de la versión 3.10, POI admite el cifrado y el descifrado de archivos XLSX. Consulte la página “Soporte de cifrado” en el sitio web de POI. Lo siguiente sigue siendo relevante para los libros de trabajo binarios XLS.

Según la página “Soporte de cifrado” del sitio web de POI, POI admite la lectura de archivos XLS y XLSX cifrados. El cifrado no se menciona en esa página, lo que implica que no es compatible. Esto se respalda mediante la búsqueda en el sitio de puntos de interés para “cifrar”, lo que arroja solo un puñado de resultados, todos ellos relacionados con el descifrado. También eché un vistazo a las fuentes de su implementación de cifrado, que parece solo manejar el descifrado. Esto no es sorprendente; POI está diseñado para la extracción de datos y la indexación de búsqueda, no para crear nuevas hojas de cálculo.

Como han sugerido otros, a menudo es posible solucionar las características que faltan en los puntos de interés creando una plantilla en Excel y luego usando puntos de interés para completarla con datos. Desafortunadamente, eso no funcionará para el cifrado porque el formato de archivo de las hojas de cálculo cifradas es radicalmente diferente.

Si está dispuesto a pagar por software comercial, la última versión de ExtenXLS tiene soporte completo de lectura y escritura para todos los formatos de cifrado compatibles con Excel. Solo construye un EncryptedWorkBookHandle en lugar de lo normal WorkBookHandle. Eso usará el cifrado más fuerte posible compatible con un JRE sin modificar, RC4 para XLS y AES de 128 bits para XLSX. Si desea utilizar AES de 256 bits con OOXML y ha instalado la política ilimitada de JCE, puede hacerlo con la MSOfficeEncrypter clase.

JExcelAPI, una popular API de hoja de cálculo Java de código abierto, no parece admitir el cifrado en absoluto. Aspose.Cells, una oferta comercial, admite un cifrado robusto. La documentación de la hoja de cálculo electrónica de Actuate parece haber desaparecido de la red, por lo que no puedo decir si admite el cifrado o no.

Dado que ninguna de las API de hojas de cálculo de Java disponibles de forma gratuita parece admitir la escritura de hojas de cálculo cifradas, si no está dispuesto a utilizar software comercial, deberá encontrar una solución alternativa. Por ejemplo, podría escribir la hoja de cálculo en un archivo ZIP cifrado. java.util.zip no admite el cifrado, pero parece que Zip4j sí.

La divulgación completa: Trabajo para Extentech, la empresa detrás de ExtenXLS.

Cree un archivo de Excel protegido con contraseña o use una plantilla existente y hágalo protegido con contraseña. Sin embargo, esto le dará a los usuarios un acceso de “solo lectura”. Aquí hay un ejemplo en el que tengo un archivo de Excel que tiene una contraseña, “secreta”:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;

public class ProtectedExcelFile 

    public static void main(final String... args) throws Exception 

        String fname = "C:\Documents and Settings\sadutta\Desktop\sample.xls";

        FileInputStream fileInput = null;
        BufferedInputStream bufferInput = null;
        POIFSFileSystem poiFileSystem = null;
        FileOutputStream fileOut = null;

        try 
            fileInput = new FileInputStream(fname);
            bufferInput = new BufferedInputStream(fileInput);
            poiFileSystem = new POIFSFileSystem(bufferInput);

            Biff8EncryptionKey.setCurrentUserPassword("secret");
            HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem, true);
            HSSFSheet sheet = workbook.getSheetAt(0);

            HSSFRow row = sheet.createRow(0);
            Cell cell = row.createCell(0);

            cell.setCellValue("THIS WORKS!");

            fileOut = new FileOutputStream(fname);
            workbook.writeProtectWorkbook(Biff8EncryptionKey.getCurrentUserPassword(), "");
            workbook.write(fileOut);
        
        catch (Exception ex) 

            System.out.println(ex.getMessage());
        
        finally 
            try 

                bufferInput.close();
            
            catch (IOException ex) 

                System.out.println(ex.getMessage());
            

            try 

                fileOut.close();
            
            catch (IOException ex) 

                System.out.println(ex.getMessage());
            
        
    

De la misma manera, debería poder escribir o modificar la plantilla existente que tiene. Una vez que haya terminado, sobrescriba la plantilla. Si su plantilla debe usarse muchas veces, es posible que desee copiar la plantilla en otra ubicación y luego usar el código para modificarla.

A menudo he encontrado con POI que para hacer cosas más complejas, un enfoque útil es crear la hoja de cálculo en Excel con las funciones avanzadas (por ejemplo, macros), luego usar POI para leer la hoja de cálculo, completarla y escribirla. POI normalmente mantendrá las características de la hoja de cálculo y agregará los datos.

No he probado esto para las contraseñas, pero sospecho que vale la pena hacer un experimento.

Consulte la ajetreada guía para desarrolladores para obtener más información.

Si para ti ha resultado útil nuestro post, sería de mucha ayuda si lo compartieras con otros desarrolladores y nos ayudes a dar difusión a este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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