我们如何能读保护密码擅长与POI API文件(的.xls)(How can we read prot

2019-06-27 04:47发布

我刚刚得知POI,找到HSSF是读取和创建Excel文件(.xls的)很简单。 然而,我发现了一些问题,想读的Excel密码保护时。 我花了一个小时才找到互联网上的这一解决方案。

能不能请您帮我解决这个问题。 我很高兴你能不能给我一个代码片段。

谢谢。

Answer 1:

POI将无法读取加密的工作簿 -这意味着,如果你保护了整个工作簿(而不仅仅是表),那么它将无法读取它。 否则,它应该工作。



Answer 2:

见http://poi.apache.org/encryption.html -如果你使用Apache POI的最近一份不够(如3.8),则加密.xls文件(HSSF)和.XLSX文件(XSSF)可以被解密(证明你有密码!)

此刻的你不能,虽然写出来加密Excel文件,只有未加密的人



Answer 3:

下面是在一个受保护的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();
    }

}


Answer 4:

你写你的问题的时候,它是不容易与Apache POI做。 从那时起,支持已经在很长的路要走

这些天,如果你想打开一个密码保护的Excel文件,无论是.xls.xlsx ,以便您知道密码,所有你需要做的是使用WorkbookFactory.create(文件,密码) ,例如,

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

这将识别文件的类型,与给定的密码解密,并打开它。 然后,您可以读取其中的内容为正常



Answer 5:

这是代码读取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;
            }


Answer 6:

拉维是正确的。 看来你可以读取密码保护,但不加密的文件与POI。 见http://osdir.com/ml/user-poi.apache.org/2010-05/msg00118.html 。 下面的代码打印出来的文件痕迹

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

如果你得到一个输出提的加密,那么你不能打开与POI文件。



文章来源: How can we read protected password excel file (.xls) with POI API