如何在R中读取两个.xlsb文件并逐单元格对比公式?
在R中对比两个XLSB文件的单元格公式
当然可以实现,而且完全不需要模拟Ctrl+~切换显示模式再保存——直接读取单元格的公式属性才是最可靠的方式,下面分两种方案说明:
方案一:直接读取公式并对比(推荐)
用openxlsx2包可以直接读取XLSB文件的单元格公式,无需依赖Excel客户端,跨平台性好。
步骤:
- 安装并加载包:
install.packages("openxlsx2") library(openxlsx2)
- 读取两个XLSB文件的单元格信息:
# 加载工作簿 wb1 <- wb_load("file1.xlsb") wb2 <- wb_load("file2.xlsb") # 获取目标工作表的所有单元格数据(包含公式、数值、位置等信息) sheet1_cells <- wb_get_cells(wb1, sheet = "Sheet1") # 替换成你的工作表名 sheet2_cells <- wb_get_cells(wb2, sheet = "Sheet1")
- 提取并对比公式:
# 筛选出包含公式的单元格 formulas1 <- sheet1_cells[!is.na(sheet1_cells$formula), c("row", "col", "formula")] formulas2 <- sheet2_cells[!is.na(sheet2_cells$formula), c("row", "col", "formula")] # 按单元格位置合并,找出公式不一致的行 merged <- merge(formulas1, formulas2, by = c("row", "col"), suffixes = c("_file1", "_file2"), all = TRUE) diff_formulas <- merged[merged$formula_file1 != merged$formula_file2, ] # 查看结果 print(diff_formulas)
这个方法直接读取Excel文件底层存储的公式,不会出现格式转换错误,效率也更高。
方案二:模拟Ctrl+~切换显示(不推荐)
如果一定要通过切换公式显示模式再保存,只能借助Windows平台的Excel COM接口(需要本地安装Excel),用RDCOMClient包实现:
install.packages("RDCOMClient") library(RDCOMClient) # 启动Excel后台进程 excel <- COMCreate("Excel.Application") excel[["Visible"]] <- FALSE # 打开文件并切换公式显示 wb <- excel[["Workbooks"]]$Open("file1.xlsb") excel[["ActiveWindow"]]$DisplayFormulas <- TRUE # 等价于Ctrl+~ # 另存为包含公式文本的文件 wb$SaveAs("file1_formulas.xlsb") # 清理资源 wb$Close(FALSE) excel$Quit() rm(excel) gc()
缺点:
- 仅支持Windows平台,必须安装Excel客户端
- 容易遇到权限、进程残留问题
- 保存后的文件是把公式作为文本存储,丢失了原单元格的公式属性,后续对比需要处理文本格式,可靠性不如方案一
内容的提问来源于stack exchange,提问作者Łukasz d
相关产品推荐
相关产品推荐

