如何使用Apache POI验证Excel工作簿及所有工作表的密码保护?
验证Excel工作簿和工作表的密码保护(Apache POI实现)
你提的这个点非常关键——isStructureLocked()和isSheetLocked()只能告诉你是否开启了保护,但没法区分是设置了密码的有效保护,还是只是勾选了保护选项但没设密码的“空保护”。下面我来具体讲怎么验证这两种场景:
一、验证工作簿(XSSFWorkbook)的密码保护
Apache POI中,工作簿的保护信息存在WorkbookProtection对象里。我们需要同时满足两个条件:
- 工作簿的结构保护已开启(
isStructureLocked()返回true) - 存在密码哈希值(说明确实设置了密码)
具体代码示例:
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对象中,需要验证:
- 工作表已锁定(
isSheetLocked()返回true) - 存在密码哈希值
代码示例:
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
相关产品推荐
相关产品推荐

