2015-01-02 123 views
0

我有一個代碼,讀取java中的受保護的Excel,但該代碼給我錯誤。 我的java代碼。如何在java中讀取密碼保護的.xls文件?

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.Iterator; 

import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.poifs.crypt.Decryptor; 
import org.apache.poi.poifs.crypt.EncryptionInfo; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 

public class REadProtectedExcel { 
    public static void main(String[] args) { 
     String fname = "D:/Vijay/BRS_docs/10168/20.11.2014/20.11.2014/JCR_30.12.14_I Pay.xls"; 
     try { 
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(fname)); 
      EncryptionInfo info = new EncryptionInfo(fs); 
      Decryptor d = Decryptor.getInstance(info); 
      if (d.verifyPassword("vijay")) { 
       System.out.println("Password correct"); 
       FileInputStream fis = new FileInputStream(fname); 
       HSSFWorkbook workbook = new HSSFWorkbook(fis); 
       HSSFSheet sheet = workbook.getSheetAt(0); 
       Iterator rowIter = sheet.rowIterator(); 
       while (rowIter.hasNext()) { 
        HSSFRow myRow = (HSSFRow) rowIter.next(); 
        Iterator cellIter = myRow.cellIterator(); 
        while (cellIter.hasNext()) { 
         String cellvalue = ""; 
         HSSFCell myCell = (HSSFCell) cellIter.next(); 
         if (myCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { 
          cellvalue = myCell.getStringCellValue(); 
         } else if (myCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { 
          cellvalue = "" + myCell.getNumericCellValue(); 
         } else if (myCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) { 
          cellvalue = "" + myCell.getBooleanCellValue(); 
         } else if (myCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { 
          cellvalue = "" + myCell.getCellFormula(); 
         } else if (myCell.getCellType() == HSSFCell.CELL_TYPE_BLANK) { 
          cellvalue = ""; 
         } 
         System.out.println("cellvalue--" + cellvalue); 
        } 
       } 
      } else { 
       System.out.println("Password wrong"); 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (GeneralSecurityException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

此代碼給我下面的錯誤。

java.io.FileNotFoundException: no such entry: "EncryptionInfo" 
    at org.apache.poi.poifs.filesystem.DirectoryNode.getEntry(DirectoryNode.java:375) 
    at org.apache.poi.poifs.filesystem.DirectoryNode.createDocumentInputStream(DirectoryNode.java:177) 
    at org.apache.poi.poifs.crypt.EncryptionInfo.<init>(EncryptionInfo.java:45) 
    at org.apache.poi.poifs.crypt.EncryptionInfo.<init>(EncryptionInfo.java:39) 
    at com.test.arrayList.REadProtectedExcel.main(REadProtectedExcel.java:22) 
  • 我使用poi3.9罐子,XMLBeans的-2.3.0jar,POI-ooml-3.6
  • 我沒有事先得到issue.Thanks。
  • 或請分享閱讀.xls文件的另一種方式。
+0

你用xlsx試過了嗎? xls是一個很難的要求嗎? –

+0

[密碼保護的Excel文件](http://stackoverflow.com/questions/2609301/password-protected-excel-file)的可能的重複,並尋找poi – Setu

+0

的第二個答案,第二個答案不起作用。 – vijayk

回答

1

Apache POI provides documentation on Encryption on the website。如果您轉到Apache POI homepage並且看到左側菜單的頂部附近,則會在Encryption Support之間找到它。我強烈建議你閱讀它!

正如你再看看,你寫的代碼用於加密.xlsx文件,它使用文件保護到舊.xls文件

由於文檔解釋一個非常不同的方式,對密碼保護.xls文件,所有你需要做的是這樣的:

String myPassword = "password"; 
org.apache.poi.hssf.record.crypto.Biff8EncryptionKey.setCurrentUserPassword(myPassword); 
HSSFWorkbook wb = new HSSFWorkbook(stream); 
相關問題