5

我刚刚学习了 POI,发现 HSSF 非常易于阅读和创建 excel 文件 (.xls)。但是,当我想读取受密码保护的 excel 时,我发现了一些问题。我花了一个小时在互联网上找到这个解决方案。

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

谢谢你。

4

6 回答 6

7

请参阅http://poi.apache.org/encryption.html - 如果您使用的是最新的 Apache POI 副本(例如 3.8),则可以解密加密的 .xls 文件(HSSF)和 .xlsx 文件(XSSF)(证明你有密码!)

目前您不能写出加密的 excel 文件,只能写出未加密的文件

于 2011-06-12T13:54:58.607 回答
4

在您撰写问题时,使用 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);

这将识别文件的类型,使用给定的密码对其进行解密,然后为您打开它。然后您可以正常阅读内容

于 2015-08-20T17:58:50.760 回答
2

Here is a complete example code that reads in a protected excel file, decrypts using a password and writes out unprotected excel file

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

}
于 2012-12-07T18:42:19.257 回答
1

这是读取 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;
            }
于 2015-08-20T04:47:34.140 回答
0

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

于 2009-11-06T01:05:29.823 回答
0

拉维是对的。看来您可以读取受密码保护但不能使用 POI 加密的文件。请参阅http://osdir.com/ml/user-poi.apache.org/2010-05/msg00118.html。下面的代码打印出文件的踪迹

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

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

于 2010-06-28T10:22:48.167 回答