gpt4 book ai didi

excel - 使用 Apache POI 更新和加密现有 xlsx 文件

转载 作者:行者123 更新时间:2023-12-04 21:52:47 26 4
gpt4 key购买 nike

我有现有的 xlsx 电子表格。我正在使用 Apache POI 3.17 来读取它,添加一些条目并在新文件中另存为受密码保护的电子表格。
运行程序后,新文件受密码保护,但我看不到新条目,只有以前存在的条目。这是程序的简化版本,它打开空电子表格,写入新单元格并使用密码保存在新文件中。当我使用密码在 Excel 2010 中打开文件时,我仍然看到空的电子表格。
任何帮助将不胜感激。谢谢

public static void main(String[] args) {

try {
POIFSFileSystem fs = new POIFSFileSystem();

EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard);
Encryptor enc = info.getEncryptor();
enc.confirmPassword("passw");


File is = new File("./empty.xlsx");
OPCPackage opc = OPCPackage.open(is, PackageAccess.READ_WRITE);

Workbook wb = WorkbookFactory.create(opc);

Sheet sheet = wb.getSheetAt(0);
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("CRYPT");

OutputStream encos = enc.getDataStream(fs);
opc.save(encos);
opc.close();

OutputStream fos = new FileOutputStream(new File("./f.xlsx"));
fs.writeFilesystem(fos);
fos.close();
}
catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}

最佳答案

这里的问题是 XSSFWorkbook 之间提交更改的差异。它是 OPCPackage . XSSFWorkbook 的变化将致力于OPCPackage仅当 XSSFWorkbook.write .因此,如果您不(或不能)写出 XSSFWorkbook , OPCPackage保持不变。
另一方面,如果你写出 XSSFWorkbook , 它总是 提交对 OPCPackage 的更改从中创建工作簿。所以如果那是 OPCPackageFile 创建, 那么这个文件总是在工作簿可能被写入另一个文件之前更新。这也很烦人。
因此,在我看来,它缺乏以编程方式影响 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);
encos.close();
wb.close();

OutputStream os = new FileOutputStream(new File("./f.xlsx"));
fs.writeFilesystem(os);
os.close();

}
}

关于excel - 使用 Apache POI 更新和加密现有 xlsx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50825415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com