2009-07-30 13 views
5

Tôi vừa mới học POI và tìm HSSF rất đơn giản để đọc và tạo tệp excel (.xls). Tuy nhiên, tôi thấy một số vấn đề khi muốn đọc excel được bảo vệ bằng mật khẩu. Tôi mất một giờ để tìm giải pháp này trên internet.Làm thế nào chúng ta có thể đọc tệp excel mật khẩu được bảo vệ (.xls) với POI API

Vui lòng giúp tôi giải quyết vấn đề này. Tôi rất vui nếu bạn có thể cho tôi một đoạn mã.

Cảm ơn bạn.

+0

Bạn có tìm thấy hoặc không tìm thấy giải pháp cho vấn đề này không? Nếu bạn đã làm, nó sẽ được tốt đẹp để đặt nó ở đây. –

Trả lời

0

POI sẽ không có khả năng đọc được mã hóa workbook - đó có nghĩa là nếu bạn đã bảo vệ các toàn bộ workbook (và không chỉ là một tấm), sau đó nó sẽ không thể đọc nó. Nếu không, nó sẽ hoạt động.

0

Ravi là đúng. Có vẻ như bạn có thể đọc mật khẩu được bảo vệ, nhưng không được mã hóa các tập tin với POI. Xem http://osdir.com/ml/user-poi.apache.org/2010-05/msg00118.html. Đoạn mã sau in ra một dấu vết của tệp

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

Nếu bạn nhận được đầu ra đề cập đến mã hóa thì bạn không thể mở tệp bằng POI.

6

Xem http://poi.apache.org/encryption.html - nếu bạn đang sử dụng bản sao Apache POI đủ gần đây (ví dụ 3.8) thì tệp .xls (HSSF) và .xlsx được mã hóa (XSSF) có thể được giải mã (chứng minh bạn có mật khẩu!)

tại thời điểm bạn không thể viết ra file excel mã hóa mặc dù, chỉ bỏ mã hóa những

2

Dưới đây là một ví dụ mã hoàn chỉnh mà đọc trong một tập tin được bảo vệ xuất sắc, giải mã sử dụng một mật khẩu và ghi ra không được bảo vệ file 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

Điều đó là mã cho tệp Đọc Excel với kiểm tra .xls và .xlsx (có mật khẩu được bảo vệ hoặc không có mật khẩu bảo vệ) làm mã mẫu hoàn chỉnh.

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

Tại sao không chỉ sử dụng [WorkbookFactory] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/WorkbookFactory.html), tất cả những gì cho bạn? – Gagravarr

+0

Cảm ơn đề xuất của bạn. Dự án của chúng tôi đã sử dụng poi-3.8-20120326.jar, poi-ooxml-3.8-20120326.jar và poi-ooxml-schemas-3.8-20120326.jar. Dường như không thể được hỗ trợ "Workbook wb = WorkbookFactory.create (File, String);". Nó không làm việc phương thức create() với hai tham số, chỉ cho một tham số. – Nyeint

+0

Khi những ngày tháng trong những tên tập tin đó hiển thị một cách tinh tế, những cái lọ này là 3.5 tuổi! Nếu bạn nâng cấp lên phiên bản mới hơn, bạn sẽ tìm thấy phương pháp được đề cập :) – Gagravarr

2

Vào thời điểm bạn viết câu hỏi, việc này không dễ dàng với Apache POI. Kể từ đó, hỗ trợ đã đến trên một chặng đường dài

Những ngày này, nếu bạn muốn mở một mật khẩu bảo vệ file Excel, cho dù .xls hoặc .xlsx, mà bạn biết mật khẩu, tất cả các bạn cần làm là sử dụng WorkbookFactory.create(File,Password), ví dụ:

File input = new File("password-protected.xlsx"); 
String password = "nice and secure"; 
Workbook wb = WorkbookFactory.create(input, password); 

Điều đó sẽ xác định loại tệp, giải mã bằng mật khẩu đã cho và mở nó cho bạn. Sau đó, bạn có thể đọc nội dung như bình thường