我刚刚学习POI并发现HSSF非常易于阅读和创建excel文件(.xls)。 但是,当我想要读取用密码保护的excel时,我发现了一些问题。 我花了一个小时在互联网上找到这个解决方案。我们如何读取使用POI API的受保护密码excel文件(.xls)
请你能帮我解决这个问题。 如果你能给我一个代码片段,我很高兴。
谢谢。
我刚刚学习POI并发现HSSF非常易于阅读和创建excel文件(.xls)。 但是,当我想要读取用密码保护的excel时,我发现了一些问题。 我花了一个小时在互联网上找到这个解决方案。我们如何读取使用POI API的受保护密码excel文件(.xls)
请你能帮我解决这个问题。 如果你能给我一个代码片段,我很高兴。
谢谢。
POI将无法读取加密工作簿 - 这意味着,如果你保护了整个工作簿(而不仅仅是表),那么它将无法读取它。否则,它应该工作。
Ravi是对的。看来你可以阅读密码保护,但没有POI加密文件。见http://osdir.com/ml/user-poi.apache.org/2010-05/msg00118.html。下面的代码打印出来的文件
POIFSLister lister = new POIFSLister();
lister.viewFile(spreadsheetPath, true);
一丝如果你得到一个输出提的加密则无法打开该文件POI。
见http://poi.apache.org/encryption.html - 如果你使用Apache POI的最近一份不够(如3.8),则加密.xls文件(HSSF)和.XLSX文件(XSSF)可以被解密(证明你有密码!)
在你无法虽然写出来加密Excel文件的那一刻,只有未加密的那些
下面是一个完整的示例代码读取受保护的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();
}
}
那是读取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;
}
为什么不使用[WorkbookFactory](http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/WorkbookFactory.html),它可以为您做所有这些工作? – Gagravarr 2015-08-20 17:56:37
当您写下您的问题时,使用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);
这将标识文件的类型,使用给定的密码对其进行解密并为您打开它。然后,您可以像往常一样阅读内容
您是否找到或找不到此问题的解决方案?如果你这样做,这将是很好的把它放在这里。 – 2009-11-06 01:04:00