R如何读取目录下多个带密码保护的xlsx文件并转换合并为csv
批量处理带密码保护的XLSX文件转换合并方案
我们可以使用excel.link包实现带统一密码的XLSX文件读取,既可以兼容你原有先转CSV再合并的流程,也可以直接读取所有文件后合并省去中转步骤,具体实现如下:
前置准备
首先安装加载所需依赖包:
# 首次使用需先安装包 install.packages("excel.link") # 加载依赖 library(excel.link) library(plyr)
注:excel.link依赖Windows系统的COM组件,仅支持Windows环境运行,Mac/Linux环境可通过Python工具msoffcrypto-tool批量解密后再用原有代码处理
方案1:和原流程对齐,先转CSV再合并
和你原来的处理逻辑完全一致,仅替换XLSX读取逻辑,支持解锁加密文件:
# 配置统一密码,替换为你的实际密码 file_pwd <- "your_unified_password" # 获取目录下所有xlsx文件 xlsx_files <- list.files(pattern = "\\.xlsx$", full.names = TRUE) # 逐个解锁xlsx转存为csv lapply(xlsx_files, function(f) { # 读取带密码的xlsx文件 df <- xl.read.file(f, password = file_pwd) # 生成对应csv文件名 csv_name <- gsub("\\.xlsx$", ".csv", f) # 写出csv文件 write.csv(df, csv_name, row.names = FALSE, na = "") }) # 合并目录下所有csv文件 csv_files <- list.files(pattern = "\\.csv$", full.names = TRUE) combined_ll <- ldply(csv_files, read.csv, header = TRUE) # 写出最终合并文件 write.csv(combined_ll, "final_combined.csv", row.names = FALSE)
方案2:无需中转CSV,直接读取合并
省去单独存每个CSV的步骤,处理效率更高:
# 配置统一密码,替换为你的实际密码 file_pwd <- "your_unified_password" # 获取目录下所有xlsx文件 xlsx_files <- list.files(pattern = "\\.xlsx$", full.names = TRUE) # 逐个解锁读取所有xlsx直接合并 combined_ll <- ldply(xlsx_files, function(f) { xl.read.file(f, password = file_pwd) }) # 写出最终合并的CSV文件 write.csv(combined_ll, "final_combined.csv", row.names = FALSE)
注意事项
- 如果你的XLSX包含多个工作表,可在
xl.read.file中增加sheet参数指定要读取的工作表,默认读取第一个工作表 - 可增加
tryCatch逻辑处理密码不匹配、文件损坏等异常情况,避免批量处理中途中断 - 若不需要保留原XLSX文件,可在读取完成后调用
unlink(xlsx_files)批量删除
内容的提问来源于stack exchange,提问作者Petra
相关产品推荐
相关产品推荐

