2009-07-30 57 views
5

Acabo de aprender un POI y encontrar que el HSSF es muy simple de leer y crear archivos de Excel (.xls). Sin embargo, encontré algunos problemas cuando quiero leer Excel protegido con contraseña. Me tomó una hora encontrar esta solución en internet.¿Cómo podemos leer la contraseña protegida de Excel (.xls) con POI API

Por favor, podría ayudarme a resolver este problema. Estoy muy contento si pudiera darme un fragmento de código.

Gracias.

+0

¿Encontró o no encontró una solución para este problema? Si lo hicieras, sería bueno que lo pongas aquí. –

Respuesta

0

PDI no será capaz de leer libros encriptados - que significa que si usted ha protegido a la toda libro (y no sólo una hoja), entonces no va a ser capaz de leerlo. De lo contrario, debería funcionar.

0

Ravi tiene razón. Parece que puede leer archivos protegidos con contraseña, pero no cifrados con POI. Ver http://osdir.com/ml/user-poi.apache.org/2010-05/msg00118.html. El siguiente código imprime una huella del archivo

POIFSLister lister = new POIFSLister(); 
lister.viewFile(spreadsheetPath, true); 

Si obtiene una salida mencionar cifrado entonces no se puede abrir el archivo con PDI.

6

Ver http://poi.apache.org/encryption.html - si está utilizando una copia bastante reciente de Apache POI (por ejemplo 3.8) se encripta archivos .xls (recintos escolares) y .xlsx (XSSF) pueden ser descifrados (demostrando que tiene la contraseña!)

por el momento no se puede escribir archivos de Excel encriptados sin embargo, únicos no codificados

2

Aquí es un código de ejemplo completo que se lee en un archivo protegido sobresalir, descifra utilizando una contraseña y escribe a cabo sin protección archivo de Excel

public static void readProtectedBinFile() { 
    try { 

     InputStream inp = new FileInputStream("c:\\tmp\\protectedFile.xls"); 
     org.apache.poi.hssf.record.crypto.Biff8EncryptionKey.setCurrentUserPassword("abracadabra"); 

     Workbook wb; 
     wb = WorkbookFactory.create(inp); 

     // Write the output to a file 
     FileOutputStream fileOut; 
     fileOut = new FileOutputStream("c:\\tmp\\unprotectedworkbook.xlsx"); 
     wb.write(fileOut); 
     fileOut.close(); 
    } catch (InvalidFormatException e) { 
     e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
1

Eso es el código para leer el archivo de Excel con comprobación de .xls y .xlsx (con contraseña protegida o sin contraseña) como código de ejemplo completo.

private Workbook createWorkbookByCheckExtension() throws IOException, InvalidFormatException { 
       Workbook workbook = null; 
       String filePath = "C:\\temp\\TestProtectedFile.xls"; 
       String fileName = "TestProtectedFile.xls"; 
       String fileExtensionName = fileName.substring(fileName.indexOf(".")); 
       if (fileExtensionName.equals(".xls")) {       
        try { 
         FileInputStream fileInputStream = new FileInputStream(new File(filePath)); 
         workbook = new HSSFWorkbook(fileInputStream);        
        } catch (EncryptedDocumentException e) { 
         // Checking of .xls file with password protected. 
         FileInputStream fileInputStream = new FileInputStream(new File(filePath)); 
         Biff8EncryptionKey.setCurrentUserPassword("password"); 
         workbook = new HSSFWorkbook(fileInputStream); 
        }       
       } else if (fileExtensionName.equals(".xlsx")){ 
        // Checking of .xlsx file with password protected. 
        String isWorkbookLock = ""; 
        InputStream is = null; 
        is = new FileInputStream(new File(filePath)); 
        if (!is.markSupported()) { 
         is = new PushbackInputStream(is, 8); 
        } 

        if (POIFSFileSystem.hasPOIFSHeader(is)) { 
         POIFSFileSystem fs = new POIFSFileSystem(is); 
         EncryptionInfo info = new EncryptionInfo(fs); 
         Decryptor d = Decryptor.getInstance(info); 
         try { 
          d.verifyPassword("password"); 
          is = d.getDataStream(fs); 
          workbook = new XSSFWorkbook(OPCPackage.open(is)); 
          isWorkbookLock = "true"; 
         } catch (GeneralSecurityException e) { 
          e.printStackTrace(); 
         }    
        }   
        if (isWorkbookLock != "true") { 
         FileInputStream fileInputStream = new FileInputStream(new File(filePath)); 
         workbook = new XSSFWorkbook(fileInputStream); 
        } 
       } 
       return workbook; 
      } 
+0

¿Por qué no simplemente utiliza [WorkbookFactory] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/WorkbookFactory.html), que hace todo eso por usted? – Gagravarr

+0

Gracias por su sugerencia. Nuestro proyecto utilizó poi-3.8-20120326.jar, poi-ooxml-3.8-20120326.jar y poi-ooxml-schemas-3.8-20120326.jar. Parece que no se puede admitir el "Workbook wb = WorkbookFactory.create (File, String);". No funcionó el método create() con dos parámetros, solo para un parámetro. – Nyeint

+0

¡Como muestran las fechas en esos nombres de archivo astutamente, esos frascos tienen 3,5 años de antigüedad! Si actualizas a una versión más nueva, encontrarás el método mencionado :) – Gagravarr

2

En el momento en que escribiste tu pregunta, no fue fácil hacerlo con Apache POI. Desde entonces, el apoyo ha llegado en un largo camino

En estos días, si desea abrir una contraseña protegida archivo de Excel, si .xls o .xlsx, del cual conoce la contraseña, todo lo que tiene que hacer es usar WorkbookFactory.create(File,Password), por ejemplo,

File input = new File("password-protected.xlsx"); 
String password = "nice and secure"; 
Workbook wb = WorkbookFactory.create(input, password); 

Eso identificará el tipo de archivo, lo descifrará con la contraseña dada, y lo abrirá para usted. A continuación, puede leer el contenido como es normal

Cuestiones relacionadas