如何使用 Apache POI 3.14 创建和编辑密码保护 Excel 工作表?
Posted
技术标签:
【中文标题】如何使用 Apache POI 3.14 创建和编辑密码保护 Excel 工作表?【英文标题】:How to create and edit a password protect excel sheet using Apache POI 3.14? 【发布时间】:2016-12-01 12:34:25 【问题描述】:大家好,我正在开发一个 Swing 应用程序,该应用程序将数据记录到受密码保护的 Excel 工作表中。
我最初的问题是我无法找到有关如何从头开始创建具有密码保护的 Excel 工作表的适当文档,而且我不完全确定 Apache POI 3.14 版是否支持它。任何有关此事的见解将不胜感激。
但我真正的问题是,假设我已经有一个受密码保护的 .xlsx 文件(通过在 Excel 本身中手动设置密码),我可以通过 WorkbookFactory.create(new FileInputStream(dataFile), "password");
访问该文件,但是一旦代码执行,文件不再受密码保护,现在任何人都可以访问它。
这是我拥有的代码的 sn-p:
// Sheet 1
private void logSheet1(File dataFile) throws IOException, InvalidFormatException
Workbook workBook = WorkbookFactory.create(new FileInputStream(dataFile), "password");
Sheet sheet1 = workBook.getSheet("Sheet 1");
Row row = sheet1.createRow(sheet1.getLastRowNum()+1);
// data
for(int i=0; i<log.length; i++)
if(log[i] == null) log[i] = new String("No data");
Cell cell = row.createCell(i);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(log[i]);
FileOutputStream fos = new FileOutputStream(dataFile);
workBook.write(fos);
fos.close();
// Sheet 2
private void logSheet2(File dataFile) throws IOException, InvalidFormatException
Workbook workBook = WorkbookFactory.create(new FileInputStream(dataFile), "password");
Sheet sheet2 = workBook.getSheet("Sheet 2");
Row row = sheet2.createRow(sheet2.getLastRowNum()+1);
// data
for(int i=0; i<log.length; i++)
if(log[i] == null) log[i] = new String("No data");
Cell cell = row.createCell(i);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(log[i]);
FileOutputStream fos = new FileOutputStream(dataFile);
workBook.write(fos);
fos.close();
【问题讨论】:
重复***.com/questions/8817290/… 您似乎没有包含在写入时加密工作簿的代码。当您follow the Apache POI docs on encrypting OOXML files with a password 并添加额外的几个步骤时会发生什么? @Gagravarr 更新我的代码后,我收到以下异常:org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: 'data.xlsx'
当我尝试实例化OPCPackage
时发生错误:OPCPackage opc = OPCPackage.open(new File("data.xlsx", PackageAccess.READ_WRITE);
确保您正在保存到一个新文件 - 尝试进行加密时没有就地写入支持
@JadHaidar 您在该语句中缺少右括号...
【参考方案1】:
是的,Apache POI 支持 Excel 中的密码保护,而且编程也非常简单。
这里是JAVA中使用Apache POI保护Excel的示例代码,希望对你有所帮助。
package excel_encryptor;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.crypt.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
//apache poi imports
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Encryption
public static void main(String[] args) throws IOException, InvalidFormatException, GeneralSecurityException
//create a new workbook
Workbook wb = new XSSFWorkbook();
//add a new sheet to the workbook
Sheet sheet1 = wb.createSheet("Sheet1");
//add 2 row to the sheet
Row row1 = sheet1.createRow(0);
Row row2 = sheet1.createRow(1);
//create cells in the row
Cell row1col1 = row1.createCell(0);
Cell row1col2 = row1.createCell(1);
//add data to the cells
row1col1.setCellValue("Top Secret Data 1");
row1col2.setCellValue("Top Secret Data 2");
//write the excel to a file
try
FileOutputStream fileOut = new FileOutputStream("D:/path/excel.xlsx");
wb.write(fileOut);
fileOut.close();
catch (IOException e)
//Add password protection and encrypt the file
POIFSFileSystem fs = new POIFSFileSystem();
EncryptionInfo info = new EncryptionInfo(fs, EncryptionMode.agile);
Encryptor enc = info.getEncryptor();
enc.confirmPassword("s3cr3t"); // s3cr3t is your password to open sheet.
OPCPackage opc = OPCPackage.open(new File("D:/path/excel.xlsx"), PackageAccess.READ_WRITE);
OutputStream os = enc.getDataStream(fs);
opc.save(os);
opc.close();
FileOutputStream fos = new FileOutputStream("D:/path/excel.xlsx");
fs.writeFilesystem(fos);
fos.close();
System.out.println("File created!!");
【讨论】:
以上是关于如何使用 Apache POI 3.14 创建和编辑密码保护 Excel 工作表?的主要内容,如果未能解决你的问题,请参考以下文章
POI:重复条目:org / apache / xmlbeans / xml / stream / BindigConfig.class
Java使用Apache poi 操作Excel-基本概念与使用
使用 Apache Poi 如何创建多值电子表格单元格,以便在 MS Excel 中正确显示,而不仅仅是 OpenOffice
雷林鹏分享:Apache POI电子表格/Spreadsheet