2016-07-27 120 views
0

嘿傢伙我正在開發一個Swing應用程序,它將數據記錄到一個受密碼保護的Excel工作表中。如何使用Apache POI 3.14創建和編輯密碼保護Excel表單?

我最初的問題是,我一直無法找到有關如何從頭開始創建帶有密碼保護的Excel工作表的正確文檔,而且我不完全確定Apache POI版本3.14是否支持它。任何有關此事的見解將不勝感激。

但是我真正的問題是,假設我已經有一個密碼保護的.xlsx文件(通過在Excel本身手動設置密碼),我可以通過WorkbookFactory.create(new FileInputStream(dataFile), "password");訪問文件,但是一旦代碼執行完畢,文件不再受密碼保護,現在任何人都可以訪問它。

這裏是我的代碼的一個片段:

// Sheet 1 
private void logSheet1(File dataFile) throws IOException, InvalidFormatException { 
    Workbook workBook = WorkbookFactory.create(new FileInputStream(dataFile), "password"); 
    Sheet sheet1 = workBook.getSheet("Sheet 1"); 
    Row row = sheet1.createRow(sheet1.getLastRowNum()+1); 

    // data 
    for(int i=0; i<log.length; i++) { 
     if(log[i] == null) log[i] = new String("No data"); 
     Cell cell = row.createCell(i); 
     cell.setCellType(Cell.CELL_TYPE_STRING); 
     cell.setCellValue(log[i]); 
    } 

    FileOutputStream fos = new FileOutputStream(dataFile); 
    workBook.write(fos); 
    fos.close(); 
} 


// Sheet 2 
private void logSheet2(File dataFile) throws IOException, InvalidFormatException { 
    Workbook workBook = WorkbookFactory.create(new FileInputStream(dataFile), "password"); 
    Sheet sheet2 = workBook.getSheet("Sheet 2"); 
    Row row = sheet2.createRow(sheet2.getLastRowNum()+1); 

    // data 
    for(int i=0; i<log.length; i++) { 
     if(log[i] == null) log[i] = new String("No data"); 
     Cell cell = row.createCell(i); 
     cell.setCellType(Cell.CELL_TYPE_STRING); 
     cell.setCellValue(log[i]); 
    } 

    FileOutputStream fos = new FileOutputStream(dataFile); 
    workBook.write(fos); 
    fos.close(); 
} 
+0

重複http://stackoverflow.com/questions/8817290/create-a-password-protected-excel-file-using-apache-poi的 – SomeDude

+0

你似乎並沒有包含的代碼加密編寫工作手冊。當您[按照Apache POI文檔使用密碼加密OOXML文件](https://poi.apache.org/encryption.html#XML-based+formats+-+Encryption)時會發生什麼,並添加額外的幾個步驟? – Gagravarr

+0

@Gagravarr更新我的代碼後,我收到以下異常: 'org.apache.poi.openxml4j.exceptions.InvalidOperationException:無法打開指定文件:'data.xlsx'' 錯誤發生在我嘗試(OPCDackage.open)(新文件(「data.xlsx」,PackageAccess.READ_WRITE);' –

回答

0

是,在Excel密碼保護被Apache POI的支持,這是非常簡單的編程爲好。

以下是在JAVA中使用Apache POI保護Excel的示例代碼,希望它能幫助您。

package excel_encryptor; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.security.GeneralSecurityException; 
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
import org.apache.poi.openxml4j.opc.OPCPackage; 
import org.apache.poi.openxml4j.opc.PackageAccess; 
import org.apache.poi.poifs.crypt.*; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 
//apache poi imports 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class Encryption { 

    public static void main(String[] args) throws IOException, InvalidFormatException, GeneralSecurityException { 

     //create a new workbook 
     Workbook wb = new XSSFWorkbook(); 

     //add a new sheet to the workbook 
     Sheet sheet1 = wb.createSheet("Sheet1"); 

     //add 2 row to the sheet 
     Row row1 = sheet1.createRow(0); 
     Row row2 = sheet1.createRow(1); 

     //create cells in the row 
     Cell row1col1 = row1.createCell(0); 
     Cell row1col2 = row1.createCell(1); 

     //add data to the cells 
     row1col1.setCellValue("Top Secret Data 1"); 
     row1col2.setCellValue("Top Secret Data 2"); 

     //write the excel to a file 
     try { 
      FileOutputStream fileOut = new FileOutputStream("D:/path/excel.xlsx"); 
      wb.write(fileOut); 
      fileOut.close(); 
     } catch (IOException e) { 
     } 

     //Add password protection and encrypt the file 
     POIFSFileSystem fs = new POIFSFileSystem(); 
     EncryptionInfo info = new EncryptionInfo(fs, EncryptionMode.agile); 
     Encryptor enc = info.getEncryptor(); 
     enc.confirmPassword("s3cr3t"); // s3cr3t is your password to open sheet. 

     OPCPackage opc = OPCPackage.open(new File("D:/path/excel.xlsx"), PackageAccess.READ_WRITE); 
     OutputStream os = enc.getDataStream(fs); 
     opc.save(os); 
     opc.close(); 

     FileOutputStream fos = new FileOutputStream("D:/path/excel.xlsx"); 
     fs.writeFilesystem(fos); 
     fos.close();  

     System.out.println("File created!!"); 

    } 
} 
相關問題