如何获取受密码保护Excel文件的工作表名及检测密码需求
解决受密码保护Excel文件的工作表名检测与自动密码提示问题
1. 先判断文件是否需要密码
.xlsx格式其实就是个压缩包,未加密的文件可以直接读取里面的xl/workbook.xml文件,加密的则不行。用下面的函数就能快速判断:
is_password_protected <- function(filename) { # 尝试读取xlsx包里的workbook.xml,失败就说明是加密文件 result <- tryCatch( { unzip(filename, files = "xl/workbook.xml", list = TRUE) FALSE }, error = function(e) { TRUE } ) return(result) }
2. 读取加密文件的工作表名
普通的excel_sheets处理不了加密文件,我们用XLConnect包的工具来读取:
library(XLConnect) get_encrypted_sheet_names <- function(filename, password) { wb <- loadWorkbook(filename, password = password) sheet_names <- getSheets(wb) closeWorkbook(wb) return(sheet_names) }
3. 整合脚本:自动判断+按需要密码
把上面的功能和你原来的代码结合,实现自动判断是否需要密码,只有加密文件才会弹出密码输入框:
library(XLConnect) library(rstudioapi) library(readxl) SheetNameGrep <- "otal|Sum|ums" filename <- "你的文件路径.xlsx" # 替换成实际文件路径 # 第一步:判断是否需要密码 needs_password <- is_password_protected(filename) # 第二步:读取所有工作表名 if (needs_password) { PW <- askForPassword(paste("Password Protected File: ", filename)) sheet_names <- get_encrypted_sheet_names(filename, PW) } else { sheet_names <- excel_sheets(filename) } # 第三步:匹配目标工作表(加ignore.case忽略大小写,适配Total/totals这类情况) SheetName <- grep(SheetNameGrep, sheet_names, value = TRUE, ignore.case = TRUE) # 第四步:读取数据 if (needs_password) { Import_Full <- xl.read.file(filename, xl.sheet = SheetName, password = PW) } else { Import_Full <- read_excel(filename, sheet = SheetName) }
补充说明
- 先安装需要的包:
install.packages(c("XLConnect", "readxl")) ignore.case = TRUE能帮你匹配不同大小写的工作表名,刚好符合你遇到的"Total"/"totals"这类场景- 这个方法不会把密码存在脚本或文件里,完全符合你的要求
内容的提问来源于stack exchange,提问作者J.C.
相关产品推荐
相关产品推荐

