2016-07-27 30 views
0

Hey Leute, ich arbeite an einer Swing-Anwendung, die Daten auf einem passwortgeschützten Excel-Blatt protokolliert.Wie erstellt und bearbeitet man ein Passwortschutz-Excel-Blatt mit Apache POI 3.14?

Mein anfängliches Problem ist, dass ich nicht in der Lage war, richtige Dokumentation zu finden, wie man die Excel-Tabelle mit Passwortschutz von Grund auf erstellt, und ich bin nicht ganz sicher, ob es sogar von Apache POI Version 3.14 unterstützt wird. Jeder Einblick in die Sache würde sehr geschätzt werden.

Allerdings ist mein echtes Problem, dass vorausgesetzt, ich habe bereits eine passwortgeschützte .xlsx Datei (durch manuelle Einstellung des Passworts aus Excel selbst), konnte ich auf die Datei über WorkbookFactory.create(new FileInputStream(dataFile), "password"); zugreifen, aber sobald der Code ausgeführt hat, die Datei war nicht mehr passwortgeschützt und jetzt kann jeder darauf zugreifen.

Hier ist ein Ausschnitt aus dem Code, den ich habe:

// 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

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

+0

Sie scheinen den Code nicht enthalten haben zu verschlüsseln die Arbeitsmappe zum Schreiben. Was passiert, wenn Sie [die Apache POI-Dokumentation zum Verschlüsseln von OOXML-Dateien mit einem Kennwort befolgen] (https://poi.apache.org/encryption.html#XML-based+formats+-+Encryption) und die zusätzlichen paar Schritte hinzufügen? – Gagravarr

+0

@Gagravarr nach der Aktualisierung meines Codes, bekomme ich die folgende Ausnahme: 'org.apache.poi.openxml4j.exceptions.InvalidOperationException: Kann die angegebene Datei nicht öffnen: 'data.xlsx'' Der Fehler tritt auf, wenn ich es versuche "OPCPackage" als solches zu instanziieren: 'OPCPackage opc = OPCPackage.open (neue Datei (" data.xlsx ", PackageAccess.READ_WRITE);' –

Antwort

0

Ja, Passwortschutz in Excel von Apache POI unterstützt wird, und es ist sehr einfach und zu programmieren.

Hier ist der Beispielcode von Schützen eines Excel mit Apache POI in JAVA, hoffe, es wird Ihnen helfen.

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!!"); 

    } 
}