Я хотел бы добавить защиту паролем в файл 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();
}
}
Что линия дает вам это исключение ? – Gagravarr
Является ли example.xslx (должен быть .xlsx) действительно XML-файлом Office 2007+? Вам не нужно использовать OPCPackage, но можно просто скопировать файл по-разному в зашифрованные. Но если example.xslx - это, например, лист вычислений Excel 2003, открытие зашифрованного файла не будет работать .... – kiwiwings
Спасибо за ваши комментарии. Я отметил строку, в которой происходит исключение (новая POIFSFileSystem). «xslx» - это опечатка. – Mathis