You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Apache POI验证Excel工作簿及所有工作表的密码保护?

验证Excel工作簿和工作表的密码保护(Apache POI实现)

你提的这个点非常关键——isStructureLocked()和isSheetLocked()只能告诉你是否开启了保护,但没法区分是设置了密码的有效保护,还是只是勾选了保护选项但没设密码的“空保护”。下面我来具体讲怎么验证这两种场景:

一、验证工作簿(XSSFWorkbook)的密码保护

Apache POI中,工作簿的保护信息存在WorkbookProtection对象里。我们需要同时满足两个条件:

  1. 工作簿的结构保护已开启(isStructureLocked()返回true)
  2. 存在密码哈希值(说明确实设置了密码)

具体代码示例:

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.WorkbookProtection;
import java.io.FileInputStream;
import java.io.IOException;

public class WorkbookPasswordCheck {
    public static void main(String[] args) throws IOException {
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("your-file.xlsx"));
        WorkbookProtection protection = workbook.getWorkbookProtection();

        boolean isPasswordProtected = workbook.isStructureLocked() 
                && protection.getPasswordHash() != null;

        if (isPasswordProtected) {
            System.out.println("该工作簿已设置带密码的结构保护");
        } else {
            System.out.println("工作簿未开启保护,或仅开启了无密码的结构锁定");
        }

        workbook.close();
    }
}

注意:getPassword()方法返回的是旧格式的密码存储值,可靠性不如getPasswordHash(),所以优先判断哈希值是否存在。

二、验证工作表(XSSFSheet)的密码保护

工作表的保护逻辑类似,保护信息存在SheetProtection对象中,需要验证:

  1. 工作表已锁定(isSheetLocked()返回true)
  2. 存在密码哈希值

代码示例:

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.SheetProtection;
import java.io.FileInputStream;
import java.io.IOException;

public class SheetPasswordCheck {
    public static void main(String[] args) throws IOException {
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("your-file.xlsx"));
        XSSFSheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
        SheetProtection sheetProtection = sheet.getSheetProtection();

        boolean isSheetPasswordProtected = sheet.isSheetLocked() 
                && sheetProtection.getPasswordHash() != null;

        if (isSheetPasswordProtected) {
            System.out.println("该工作表已设置带密码的保护");
        } else {
            System.out.println("工作表未开启保护,或仅开启了无密码的锁定");
        }

        workbook.close();
    }
}

补充:如果工作表只是部分功能被保护(比如只禁止编辑单元格,允许排序),只要设置了密码,getPasswordHash()就会有值,isSheetLocked()也会返回true,这个判断逻辑依然适用。

核心逻辑总结

判断是否是带密码的有效保护,本质是:

  • 先确认保护状态已开启(对应isStructureLocked()/isSheetLocked()为true)
  • 再确认存在密码哈希值(说明系统存储了密码验证信息,不是空保护)

内容的提问来源于stack exchange,提问作者John Wambura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:28:18