如何使用 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

雷林鹏分享:Apache POI电子表格/Spreadsheet

如何使用apache poi在已存在的excel文件中创建新工作表