2009-07-30 193 views
5

我剛剛學習POI並發現HSSF非常易於閱讀和創建excel文件(.xls)。 但是,當我想要讀取用密碼保護的excel時,我發現了一些問題。 我花了一個小時在互聯網上找到這個解決方案。我們如何讀取使用POI API的受保護密碼excel文件(.xls)

請你能幫我解決這個問題。 如果你能給我一個代碼片段,我很高興。

謝謝。

+0

您是否找到或找不到此問題的解決方案?如果你這樣做,這將是很好的把它放在這裏。 – 2009-11-06 01:04:00

回答

0

POI將無法讀取加密工作簿 - 這意味着,如果你保護了整個工作簿(而不僅僅是表),那麼它將無法讀取它。否則,它應該工作。

0

Ravi是對的。看來你可以閱讀密碼保護,但沒有POI加密文件。見http://osdir.com/ml/user-poi.apache.org/2010-05/msg00118.html。下面的代碼打印出來的文件

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

一絲如果你得到一個輸出提的加密則無法打開該文件POI。

6

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

在你無法雖然寫出來加密Excel文件的那一刻,只有未加密的那些

2

下面是一個完整的示例代碼讀取受保護的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(); 
    } 

} 
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; 
      } 
+0

爲什麼不使用[WorkbookFactory](http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/WorkbookFactory.html),它可以爲您做所有這些工作? – Gagravarr 2015-08-20 17:56:37

2

當您寫下您的問題時,使用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); 

這將標識文件的類型,使用給定的密碼對其進行解密併爲您打開它。然後,您可以像往常一樣閱讀內容