Pergunta

Acabei de saber POI e encontrar o HSSF é muito simples de ler e criar arquivos Excel (.xls). No entanto, eu encontrei algum problema quando quiser ler excel protegido com senha. Levei uma hora para encontrar esta solução na internet.

Por favor, você poderia me ajudar a resolver este problema. Estou muito contente se você poderia me dar um trecho de código.

Obrigado.

Foi útil?

Solução

POI não será capaz de ler criptografado pastas de trabalho - Isso significa que se você tem protegido o toda pasta de trabalho (e não apenas uma folha), então ele não vai ser capaz de lê-lo. Caso contrário, ele deve funcionar.

Outras dicas

Consulte http://poi.apache.org/encryption.html - se você estiver usando um bastante recente cópia do Apache POI (por exemplo, 3,8) arquivos serão criptografados .xls (HSSF) e arquivos .xlsx (XSSF) pode ser descriptografado (provando que você tem a senha!)

No momento você não pode escrever arquivos do Excel criptografados, porém, únicos un-criptografado

Aqui está um exemplo de código completo que lê em um arquivo excel protegido, decifra usando uma senha e escreve arquivo excel não protegida

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

}

No momento que você escreveu sua pergunta, não foi fácil fazer com Apache POI. Desde então, o apoio veio em um longo caminho

Hoje em dia, se você quiser abrir um arquivo Excel protegido por senha, se .xls ou .xlsx, para que você saiba a senha, tudo que você precisa fazer é usar o WorkbookFactory.create (File, senha) , por exemplo

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

Isso vai identificar o tipo do arquivo, decifrá-lo com a senha dada, e abri-lo para você. Você pode, em seguida, ler o conteúdo como normal

Esse é o código para o arquivo Leia Excel com a verificação de .xls e .xlsx (com protegido por senha ou sem senha protegida) como exemplo de código 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 é certo. Parece que você pode ler protegido por senha, mas não arquivos criptografados com POI. Consulte http://osdir.com/ml/user -poi.apache.org/2010-05/msg00118.html . As seguintes impressões de código fora um traço do arquivo

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

Se você receber uma criptografia mencionar saída, então você não pode abrir o arquivo com POI.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top