Comment pouvons-nous lire le fichier Excel protégé par mot de passe (.xls) avec l'API POI

StackOverflow https://stackoverflow.com/questions/1204382

  •  05-07-2019
  •  | 
  •  

Question

Je viens d’apprendre les points d’intérêt et je trouve que le fichier HSSF est très simple à lire et à créer un fichier Excel (.xls). Cependant, j'ai trouvé un problème lorsque je veux lire Excel protégé par mot de passe. Il m'a fallu une heure pour trouver cette solution sur Internet.

S'il vous plaît pourriez-vous m'aider à résoudre ce problème. Je suis très heureux si vous pouviez me donner un extrait de code.

Merci.

Était-ce utile?

La solution

Les

points d'intérêt ne pourront pas lire les classeurs cryptés. Autrement dit, si vous avez protégé le document entier (et pas seulement une feuille), il ne le fera pas. être capable de le lire. Sinon, cela devrait fonctionner.

Autres conseils

Voir http://poi.apache.org/encryption.html - si vous utilisez une version assez récente Une copie de POI Apache (par exemple 3.8), puis les fichiers .xls chiffrés (HSSF) et les fichiers .xlsx (XSSF) peuvent être déchiffrés (en prouvant que vous avez le mot de passe!)

Pour le moment, vous ne pouvez pas écrire de fichiers Excel chiffrés, mais uniquement des fichiers non chiffrés

.

Voici un exemple de code complet qui lit dans un fichier Excel protégé, déchiffre à l'aide d'un mot de passe et écrit un fichier Excel non protégé

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

}

Au moment où vous avez rédigé votre question, ce n'était pas facile à faire avec Apache POI. Depuis lors, le support a beaucoup évolué

Ces jours-ci, si vous souhaitez ouvrir un fichier Excel protégé par mot de passe, que ce soit .xls ou .xlsx , pour lequel vous connaissez le mot de passe, il vous suffit de utilise WorkbookFactory.create (fichier, mot de passe) , par exemple

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

Cela identifiera le type du fichier, le déchiffrera avec le mot de passe donné et l'ouvrira pour vous. Vous pouvez ensuite lire le contenu normalement.

C’est le code pour le fichier Read Excel avec la vérification de .xls et .xlsx (avec mot de passe protégé ou non protégé par mot de passe) comme exemple de code complet.

 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 a raison. Il semble que vous puissiez lire les fichiers protégés par mot de passe, mais pas cryptés avec POI. Voir http://osdir.com/ml/user -poi.apache.org/2010-05/msg00118.html . Le code suivant imprime une trace du fichier

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

Si vous obtenez une sortie mentionnant le chiffrement, vous ne pouvez pas ouvrir le fichier avec POI.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top