2016-07-27 119 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!!"); 

    } 
} 
相关问题