Как мы можем прочитать защищенный файл Excel с паролем (.xls) с помощью POI API - PullRequest
5 голосов
/ 30 июля 2009

Я только что изучил POI и обнаружил, что HSSF очень просто читать и создавать файлы Excel (.xls). Тем не менее, я обнаружил некоторые проблемы, когда хочу прочитать Excel защищен паролем. Мне понадобился час, чтобы найти это решение в интернете.

Пожалуйста, не могли бы вы помочь мне решить эту проблему. Я очень рад, что вы могли бы дать мне фрагмент кода.

Спасибо.

Ответы [ 6 ]

6 голосов
/ 12 июня 2011

См. http://poi.apache.org/encryption.html - если вы используете достаточно свежую копию Apache POI (например, 3.8), то зашифрованные файлы .xls (HSSF) и .xlsx (XSSF) могут быть расшифрованы (что доказывает пароль!)

В настоящее время вы не можете записывать зашифрованные файлы Excel, только незашифрованные

2 голосов
/ 20 августа 2015

В то время, когда вы писали свой вопрос, это было нелегко сделать с помощью Apache POI. С тех пор поддержка прошла долгий путь

В наши дни, если вы хотите открыть защищенный паролем файл Excel, .xls или .xlsx, для которого вы знаете пароль, все, что вам нужно сделать, это использовать WorkbookFactory.create (File, Password ) , например

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

Это определит тип файла, расшифрует его по заданному паролю и откроет его для вас. Затем вы можете читать содержимое как обычно

2 голосов
/ 07 декабря 2012

Вот полный пример кода, который читает в защищенном файле Excel, расшифровывает с помощью пароля и записывает незащищенный файл 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 голос
/ 20 августа 2015

Это код для файла Read Excel с проверкой .xls и .xlsx (с паролем или без пароля) в качестве полного кода примера.

 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 голосов
/ 28 июня 2010

Рави прав. Кажется, вы можете читать защищенные паролем, но не зашифрованные файлы с POI. См. http://osdir.com/ml/user-poi.apache.org/2010-05/msg00118.html. Следующий код распечатывает след файла

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

Если вы получаете вывод с упоминанием шифрования, вы не можете открыть файл с POI.

0 голосов
/ 06 ноября 2009

POI не сможет читать зашифрованные рабочие книги - это означает, что если вы защитили всю рабочую книгу (а не только лист), то она не сможет читать это. В противном случае это должно работать.

...