Проблема здесь заключается в несоответствии в фиксации изменений между XSSFWorkbook
и OPCPackage
.Изменения в XSSFWorkbook
будут зафиксированы в OPCPackage
только при XSSFWorkbook.write
.Поэтому, если вы не (или не можете) записать XSSFWorkbook
, OPCPackage
останется без изменений.
С другой стороны, если вы записываете XSSFWorkbook
, он всегда фиксирует изменения в OPCPackage
, из которого была создана рабочая книга.Таким образом, если это был OPCPackage
, созданный из File
, то этот файл всегда обновляется до того, как книга будет записана в другой файл.Это тоже раздражает.
Так что, по моему мнению, у него нет возможности программно влиять на процесс фиксации между XSSFWorkbook
и OPCPackage
.
Но главная проблема с вашим кодом заключается в том, чточто вы записываете OPCPackage
, который не обновляется, в поток данных Encryptor
.Вместо этого вы должны написать Workbook
, который вы обновили.
Так, например:
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.poifs.crypt.*;
import org.apache.poi.ss.usermodel.*;
import java.io.*;
class ExcelUpdateAndEncrypt {
public static void main(String[] args) throws Exception {
POIFSFileSystem fs = new POIFSFileSystem();
EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard);
Encryptor enc = info.getEncryptor();
enc.confirmPassword("passw");
FileInputStream is = new FileInputStream("./empty.xlsx");
Workbook wb = WorkbookFactory.create(is);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
cell.setCellValue("CRYPT");
OutputStream encos = enc.getDataStream(fs);
wb.write(encos);
wb.close();
OutputStream os = new FileOutputStream(new File("./f.xlsx"));
fs.writeFilesystem(os);
os.close();
}
}