2016-11-09 3 views
1

Я хотел бы добавить защиту паролем в файл xlsx, созданный с помощью poi 3.14. Требования к документации, что это возможно:Настройка защиты паролем в рабочей книге XSSF

http://poi.apache.org/encryption.html

Используя пример, который я попробовал это так:

public static void main(String[] args) 
{ 
    try(Workbook wb = new XSSFWorkbook()) 
    { 

     //<...> 
     try(ByteArrayOutputStream baos = new ByteArrayOutputStream()) 
     { 
      wb.write(baos); 
      byte[] res = baos.toByteArray(); 
      try(ByteArrayInputStream bais = new ByteArrayInputStream(res)) 
      { 
       try(POIFSFileSystem fileSystem = new POIFSFileSystem(bais);) // Exception happens here 
       { 
        EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile); 
        Encryptor enc = info.getEncryptor(); 
        enc.confirmPassword("pass"); 
        OutputStream encryptedDS = enc.getDataStream(fileSystem); 
        OPCPackage opc = OPCPackage.open(new File("example.xlsx"), PackageAccess.READ_WRITE); 
        opc.save(encryptedDS); 
        opc.close(); 
       } 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

К сожалению, в примере код не совместим с XLSX файлов и, как В результате я получаю следующее исключение:

The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF) 

Помогите пожалуйста? Я не могу найти подходящую альтернативу для XLSX ...

Спасибо вам всем за помощь. Вот мой рабочий результат:

public static void main(String[] args) 
{ 
    try(Workbook wb = new XSSFWorkbook()) 
    { 
     Sheet sheet = wb.createSheet(); 
     Row r = sheet.createRow(0); 
     Cell cell = r.createCell(0); 
     cell.setCellType(Cell.CELL_TYPE_STRING); 
     cell.setCellValue("Test"); 
     try(POIFSFileSystem fileSystem = new POIFSFileSystem();) 
     { 
      EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard); 
      Encryptor enc = info.getEncryptor(); 
      enc.confirmPassword("pass"); 
      OutputStream encryptedDS = enc.getDataStream(fileSystem); 
      wb.write(encryptedDS); 
      FileOutputStream fos = new FileOutputStream("C:/example.xlsx"); 
      fileSystem.writeFilesystem(fos); 
      fos.close(); 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
+1

Что линия дает вам это исключение ? – Gagravarr

+2

Является ли example.xslx (должен быть .xlsx) действительно XML-файлом Office 2007+? Вам не нужно использовать OPCPackage, но можно просто скопировать файл по-разному в зашифрованные. Но если example.xslx - это, например, лист вычислений Excel 2003, открытие зашифрованного файла не будет работать .... – kiwiwings

+0

Спасибо за ваши комментарии. Я отметил строку, в которой происходит исключение (новая POIFSFileSystem). «xslx» - это опечатка. – Mathis

ответ

2

Вы неправильно читали documentation on encrypting in OOXML file. Вы поэтому неправильно пытаться загрузить файл, используя неверный код, когда вам просто нужно, чтобы сохранить его

Без обработки ошибок, ваш код в основном хочет быть

// Prepare 
POIFSFileSystem fs = new POIFSFileSystem(); 
EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile); 
CipherAlgorithm.aes192, HashAlgorithm.sha384, -1, -1, null); 

Encryptor enc = info.getEncryptor(); 
enc.confirmPassword("foobaa"); 

// Create the normal workbook 
Workbook wb = new XSSFWorkbook(); 
Sheet s = wb.createSheet(); 
// TODO Populate 

// Encrypt 
OutputStream os = enc.getDataStream(fs); 
wb.save(os); 
opc.close(); 

// Save 
FileOutputStream fos = new FileOutputStream("protected.xlsx"); 
fs.writeFilesystem(fos); 
fos.close(); 
Смежные вопросы