Domanda

Ho appena imparato il PDI e trovo che l'HSSF sia molto semplice da leggere e creare un file Excel (.xls). Tuttavia, ho riscontrato qualche problema quando si desidera leggere Excel protetto con password. Mi ci è voluta un'ora per trovare questa soluzione su Internet.

Per favore, potresti aiutarmi a risolvere questo problema. Sono molto contento che tu mi possa dare uno snippet di codice.

Grazie.

È stato utile?

Soluzione

I PDI non saranno in grado di leggere le cartelle di lavoro crittografate; ciò significa che se hai protetto la intera cartella di lavoro (e non solo un foglio), non lo farà saperlo leggere. Altrimenti, dovrebbe funzionare.

Altri suggerimenti

Vedi http://poi.apache.org/encryption.html - se stai utilizzando un numero abbastanza recente copia del PDI di Apache (ad es. 3.8) quindi dei file .xls crittografati (HSSF) e dei file .xlsx (XSSF) possono essere decifrati (dimostrando di avere la password!)

Al momento non è possibile scrivere file Excel crittografati, solo quelli non crittografati

Ecco un codice di esempio completo che legge in un file Excel protetto, decodifica usando una password e scrive il file Excel non protetto

    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();
    }

}

Al momento in cui hai scritto la tua domanda, non era facile fare con il POI di Apache. Da allora, il supporto ha fatto molta strada

In questi giorni, se si desidera aprire un file Excel protetto da password, sia .xls o .xlsx , per i quali si conosce la password, tutto ciò che occorre fare è use WorkbookFactory.create (File, Password) , ad esempio

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

Questo identificherà il tipo di file, lo decifrerà con la password data e lo aprirà per te. Puoi quindi leggere i contenuti normalmente

Questo è il codice per leggere il file Excel con il controllo di .xls e .xlsx (con password protetta o senza password protetta) come codice di esempio 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;
            }

Ravi ha ragione. Sembra che tu possa leggere file protetti da password, ma non crittografati con PDI. Vedi http://osdir.com/ml/user -poi.apache.org/2010-05/msg00118.html. Il codice seguente stampa una traccia del file

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

Se si ottiene un output che menziona la crittografia, non è possibile aprire il file con PDI.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top