2014-09-23 114 views
1
格式(.xlsx)

我曾嘗試下面的代碼,讀取密碼保護的Excel文件使用Java

import org.apache.poi.poifs.crypt.Decryptor; 
import org.apache.poi.poifs.crypt.EncryptionInfo; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 

    POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("D://protectedfile.xlsx")); 
    EncryptionInfo info = new EncryptionInfo(fs); 
    Decryptor d = new Decryptor(info); //Error 
    d.verifyPassword(Decryptor.DEFAULT_PASSWORD); 

它拋出一個錯誤編譯錯誤:Cannot instantiate the type Decryptor

但最終這種方法會需要我來複制和創建一個可以讀取數據的新工作簿。

  1. 爲什麼我無法實例化Decryptor?
  2. 有沒有其他辦法比這個,所以我可以簡單地讀取密碼保護excel文件,而不創建它的副本

注:我已經看過這個帖子reading excel file,但並不能幫助我的確切情況

+0

你是否確信你所有的[需要POI罐子]的( http://poi.apache.org/overview.html#components)在你的類路徑上? – Gagravarr 2014-09-23 12:55:57

+0

是的,我有所有需要閱讀excel的罐子,在這裏我不能只讀密碼保護的罐子。並且我還導入了'import org.apache.poi.poifs.crypt.Decryptor;'它確保jar中存在,否則我會得到編譯錯誤 – 2014-09-24 06:10:23

+0

您確定您使用的是最新版本的Apache POI嗎?你在編譯時在運行時有相同的jar嗎? – Gagravarr 2014-09-24 09:03:32

回答

1

啊,我發現你的問題。這是該行:

Decryptor d = new Decryptor(info); 

正如Apache POI Encryption documentation顯示,該行必須

Decryptor d = Decryptor.getInstance(info); 

你會被建議review the POI docs on encryption,並且確保你使用的最新版本Apache POI(寫入時爲3.11測試版)

此外,從InputStream打開文件不是recommended, as per the documentation,因爲它速度較慢且內存較高(所有內容都必須緩衝)。相反,你的代碼確實應該:

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 
} 

最後,得到解密後的數據,並將其傳遞到XSSFWorkbook讀取加密的工作簿

+0

它解決了我的第一個問題。你能爲第二個單詞說一些嗎?這就是我所關心的 – 2014-09-24 10:18:33

+0

我不明白你的第二個問題。你沒有複製它,你打開它! – Gagravarr 2014-09-24 10:47:42

+0

謝謝我真的與後http://stackoverflow.com/questions/2609301/password-protected-excel-file,關於複製混淆.. – 2014-09-24 11:50:37