我们可以使用java更新密码保护的excel表的行和列吗?

时间:2016-03-30 10:20:19

标签: java excel selenium apache-poi

NPOIFSFileSystem fs = new NPOIFSFileSystem(new File("C://Users//RK5026051//Downloads//500_Lanes.xls"));
        EncryptionInfo info = new EncryptionInfo(fs);
        Decryptor d = Decryptor.getInstance(info);
        if (d.verifyPassword("manh.com")) {
           HSSFWorkbook wb = new HSSFWorkbook(d.getDataStream(fs));
        } else {
           System.out.println("wrong password");
        }
        // TODO Auto-generated method stub
    }

错误 -

Exception in thread "main" java.io.FileNotFoundException: no such entry: "EncryptionInfo", had: [_VBA_PROJECT_CUR, SummaryInformation, DocumentSummaryInformation, Workbook]
    at org.apache.poi.poifs.filesystem.DirectoryNode.getEntry(DirectoryNode.java:370)
    at org.apache.poi.poifs.filesystem.DirectoryNode.createDocumentInputStream(DirectoryNode.java:177)
    at org.apache.poi.poifs.crypt.EncryptionInfo.<init>(EncryptionInfo.java:51)
    at org.apache.poi.poifs.crypt.EncryptionInfo.<init>(EncryptionInfo.java:47)
    at auto.excel.main(excel.java:15)

我正在使用selenium从应用程序下载文件,我需要更新excel文件中的某些字段,然后再次上传。**

我知道我正在下载的excel文件的密码,现在我需要编写一个代码,以便更新特定的行和列,但我无法对该excel文件进​​行任何操作,我猜这是因为它的密码受保护。

我已经尝试了堆栈溢出的一些答案,但我没有工作。此外,我没有在互联网上获得有关此主题的许多材料。 这是我试过的示例代码

NPOIFSFileSystem fs = new NPOIFSFileSystem(new File("D://protectedfile.xlsx"));
EncryptionInfo info = new EncryptionInfo(fs);
Decryptor d = Decryptor.getInstance(info);
if (d.verifyPassword("password")) {
   XSSFWorkbook wb = new XSSFWorkbook(d.getDataStream(fs));
} else {
   // Password is wrong
}

1 个答案:

答案 0 :(得分:1)

首先,我知道这些日子并不流行,但你应该really really read the Apache POI documentation on reading protected files。从那以后,您会发现您正在尝试使用XLSX解密方法来保护受保护的XLS文件,这无疑令人失望!

但是,打开

时,还有更简单的方法 - WorkbookFactory can take the password of your spreadsheet

所以,只需将代码更改为非常简单:

Workbook wb = WorkbookFactory.create(new File("protected.xls"), "password", true);

这将以只读模式打开工作簿,使用提供的密码进行读取,并自动识别所需类型