我使用Apache POI框架生成了一个xlsx密码保护文件,下面添加了我的代码。然而,我无法使用Excel工具打开生成的文件。我可以使用Plan Maker免费工具打开它。欢迎任何建议。
我有以下jars使用,commons-collections4-4.4.jar,commons-compress-1.20.jar,commons-math3-3.0.jar,poi-4.1.2.jar,poi-ooxml-4.1.2.jar,poi-ooxml-schemas-4.1.2.jar,SparseBitSet-1.1.jar,xmlbeans-3.1.0.jar
package com.pega.gcs.createworkbook;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ProtectedExcelFile {
public static void main(final String... args) throws Exception {
String fname = "FromJavaSecure1.xlsx";
String label="Sheet1-Abc";
String cellvalue="Cell1";
org.apache.poi.xssf.usermodel.XSSFSheet sheet;
org.apache.poi.xssf.usermodel.XSSFRow row;
org.apache.poi.xssf.usermodel.XSSFCell cell;
org.apache.poi.hssf.usermodel.HSSFSheet hsheet;
org.apache.poi.hssf.usermodel.HSSFRow hrow;
org.apache.poi.hssf.usermodel.HSSFCell hcell;
FileInputStream fileInput = null;
BufferedInputStream bufferInput = null;
POIFSFileSystem poiFileSystem = null;
FileOutputStream fileOut = null;
try {
try(
HSSFWorkbook workbook = new HSSFWorkbook();
)
{
hsheet=workbook.createSheet(label); hrow=hsheet.createRow(0);
hcell=hrow.createCell(0); hcell.setCellValue(cellvalue);
Biff8EncryptionKey.setCurrentUserPassword("secret");
fileOut = new FileOutputStream(fname);
workbook.writeProtectWorkbook(Biff8EncryptionKey.getCurrentUserPassword(), "");
workbook.write(fileOut);
}
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
finally {
/*
* try {
*
* bufferInput.close(); } catch (IOException ex) {
*
* System.out.println(ex.getMessage()); }
*
* try {
*
* fileOut.close(); } catch (IOException ex) {
*
* System.out.println(ex.getMessage()); }
*/
}
}
}
参考 https://poi.apache.org/encryption.html 后,设法使以下代码符合我的要求。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package excelpasswordgeneration;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* @author venu
*/
public class ExcelPasswordGeneration {
public static void main(String[] args) throws Exception {
try (POIFSFileSystem fs = new POIFSFileSystem()) {
EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
// EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile, CipherAlgorithm.aes192, HashAlgorithm.sha384, -1, -1, null);
Encryptor enc = info.getEncryptor();
enc.confirmPassword("foobaa");
String label = "Sheet1-Raja";
String cellvalue = "Cell1";
org.apache.poi.xssf.usermodel.XSSFSheet sheet;
org.apache.poi.xssf.usermodel.XSSFRow row;
org.apache.poi.xssf.usermodel.XSSFCell cell;
try (
XSSFWorkbook workbook = new XSSFWorkbook()) {
sheet = workbook.createSheet(label);
row = sheet.createRow(0);
cell = row.createCell(0);
cell.setCellValue(cellvalue);
ByteArrayOutputStream out = new ByteArrayOutputStream();
workbook.write(out);
// Read in an existing OOXML file and write to encrypted output stream
// don't forget to close the output stream otherwise the padding bytes aren't added
try (OPCPackage opc = OPCPackage.open(new ByteArrayInputStream(out.toByteArray()));
OutputStream os = enc.getDataStream(fs)) {
opc.save(os);
}
// Write out the encrypted version
try (FileOutputStream fos = new FileOutputStream("sample-encrypted.xlsx")) {
fs.writeFilesystem(fos);
}
}
}
}
}
问题内容: 我正在尝试在excel中打开一个受密码保护的文件,而无需任何用户交互。我在线搜索,发现此代码使用win32com.client运行此程序时,仍然提示输入密码… 问题答案: 我认为命名参数在这种情况下不起作用。因此,您必须执行以下操作: 有关Workbooks.Open方法的详细信息,请参见http://msdn.microsoft.com/zh- cn/library/office/f
问题内容: 我有一个受密码保护的Excel电子表格。我需要打开此电子表格并从中读取数据。我一直在尝试使用POI API无济于事。首选Java解决方案,但任何想法都会有所帮助。 编辑:是的,我有密码。该文件在excel中受密码保护;必须输入密码才能查看电子表格。 Edit2:我无法使用带有密码的POI打开它,我在寻找替代解决方案。 问题答案: 您可以使用JExcelApi。 自从我这样做已经有一段时
用户可以将Excel文档保存为. xls或xml-table。结果是一个具有固定结构的xml-file,Excel可以用它纠正工作。 可以用java中的ApachePOI打开这种类型的excel文件吗? 事先谢谢你,安德烈。
问题内容: 尝试使用ApachePOI打开Excel时,我得到 我检查了。没有创建这样的文件夹。我正在使用Apache POI 3.6版。 有什么帮助吗?类似的代码在其他工作区中运行良好。在这里不知所措。 码: 问题答案: 您为什么要制作一个非常好的文件,将其包装在中,然后要求POI必须为您缓冲整个文件,以便可以进行随机访问?如果直接将文件直接传递给POI,生活会好很多,因此可以根据需要跳过它!
问题内容: 我已经使用Java创建了zip文件,如下所示 现在,我想在单击zip文件时提示我输入密码,然后解压缩zip文件。请任何帮助,我应该怎么走? 问题答案: 尝试以下基于以下代码Zip4j: 来自。 用法示例:
问题内容: 我想使pdf文件受密码保护。我只是对它进行了搜索,并在下面找到了一个好的解决方案。它工作正常,但是使用下面给定的代码保护pdf后,它会清除pdf中已经存在的所有数据。 此代码使用的jar文件是: itextpdf-5.2.1.jar bcmail-jdk16-1.46.jar bcprov-jdk16-1.46.jar bctsp-jdk16-1.46.jar 保护PDF的代码: 我需