R/vba - 打开并保存多个工作簿 (+500) 并丢弃公式,即。只保留数据框
R/vba - Open and save several workbooks (+500) and discarding formulas ie. keeping only dataframe
我想打开多个包含多个电子表格的工作簿文件 (xlsx),丢弃每个单元格中的公式,只保留其中的数据。我会手动完成,但至少有 500 个工作簿,我想将任务自动化。
我发现自己有多个部分解决方案。也许最简单的方法是通过 vba 来完成,但我不知道如何编写这些指令。我可以管理的其他解决方案是通过 R。
我测试了几个包,最有用的是 xlsx,不幸的是我一次只能保存 1 个电子表格,每个工作簿有 15 个以上,我没有找到如何将每个电子表格合并到一个文件中(一个工作簿)。
到目前为止,我采用的解决方案是在循环内打开文件,然后使用 XLConnect 再次保存它们。我搜索了一个 write-without-formula,知道 open-without-formula 存在,但我没有找到选项......这些包有一个简单的解决方案还是我应该更多地研究 VBA ?
r 暂定:
library("XLConnect")
wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles")
wblist <- list.files(wbdir)
i <- 0L
for (i in 1:length(wblist)) {
wb_formulas <- loadWorkbook(wblist[[i]])
# something to overwriteformulas : opening witout formulas like xlsx/openxlsx package
# writing without ...
wb_df <- saveWorkbook(wb_formulas, paste(c("wb_", i,".xlsx"),collapse = ""))
}
考虑 R 的 RDComclient
,它可以 COM interface to the Excel object library where you can use R to loop through needed files and corresponding worksheets and use Excel's own methods (not third-party package methods), Range.Copy and Range.PasteSpecial 复制单元格值,省略公式。
下面的过程被包装在 tryCatch
中,即使出现简单的错误也可以干净地退出处理。请注意:有些 COMExceptions
未被捕获,您需要从任务管理器中退出 EXCEL.EXE 进程。
library(RDCOMClient)
wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles")
wblist <- list.files(wbdir, full.names = TRUE)
xlPasteValues <- -4163
for (wb in wblist) {
tryCatch({
# Create COM Connection to Excel
xlApp <- COMCreate("Excel.Application")
xlApp[['Visible']] <- FALSE
xlApp[['DisplayAlerts']] <- FALSE
# Open workbook
xlWB <- xlApp[["Workbooks"]]$Open(wb)
# Iterate through each worksheet
for (s in seq(xlWB$Worksheets()$Count())) {
xlSheet <- xlWB$Worksheets(s)
# Copy and paste values
xlSheet$Cells()$Copy()
xlSheet$Cells()$PasteSpecial(xlPasteValues)
xlApp[['CutCopyMode']] <- FALSE
xlSheet$Activate()
xlSheet$Range("A1")$Select()
}
}, error=function(e) {
print(e)
},
finally={
xlApp[['DisplayAlerts']] <- TRUE
# Save Changes
xlWB$Close(TRUE) # THIS WILL OVERWRITE (BACKUP IN TEST MODE)
xlApp$Quit()
# Release resources
xlSheet <- NULL
xlWB <- NULL
xlApp <- NULL
rm(list=ls())
gc()
}
)
}
由于 COM 是一项 Windows 技术,上述解决方案仅适用于 Windows 环境中的 R 运行。
我想打开多个包含多个电子表格的工作簿文件 (xlsx),丢弃每个单元格中的公式,只保留其中的数据。我会手动完成,但至少有 500 个工作簿,我想将任务自动化。
我发现自己有多个部分解决方案。也许最简单的方法是通过 vba 来完成,但我不知道如何编写这些指令。我可以管理的其他解决方案是通过 R。
我测试了几个包,最有用的是 xlsx,不幸的是我一次只能保存 1 个电子表格,每个工作簿有 15 个以上,我没有找到如何将每个电子表格合并到一个文件中(一个工作簿)。
到目前为止,我采用的解决方案是在循环内打开文件,然后使用 XLConnect 再次保存它们。我搜索了一个 write-without-formula,知道 open-without-formula 存在,但我没有找到选项......这些包有一个简单的解决方案还是我应该更多地研究 VBA ?
r 暂定:
library("XLConnect")
wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles")
wblist <- list.files(wbdir)
i <- 0L
for (i in 1:length(wblist)) {
wb_formulas <- loadWorkbook(wblist[[i]])
# something to overwriteformulas : opening witout formulas like xlsx/openxlsx package
# writing without ...
wb_df <- saveWorkbook(wb_formulas, paste(c("wb_", i,".xlsx"),collapse = ""))
}
考虑 R 的 RDComclient
,它可以 COM interface to the Excel object library where you can use R to loop through needed files and corresponding worksheets and use Excel's own methods (not third-party package methods), Range.Copy and Range.PasteSpecial 复制单元格值,省略公式。
下面的过程被包装在 tryCatch
中,即使出现简单的错误也可以干净地退出处理。请注意:有些 COMExceptions
未被捕获,您需要从任务管理器中退出 EXCEL.EXE 进程。
library(RDCOMClient)
wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles")
wblist <- list.files(wbdir, full.names = TRUE)
xlPasteValues <- -4163
for (wb in wblist) {
tryCatch({
# Create COM Connection to Excel
xlApp <- COMCreate("Excel.Application")
xlApp[['Visible']] <- FALSE
xlApp[['DisplayAlerts']] <- FALSE
# Open workbook
xlWB <- xlApp[["Workbooks"]]$Open(wb)
# Iterate through each worksheet
for (s in seq(xlWB$Worksheets()$Count())) {
xlSheet <- xlWB$Worksheets(s)
# Copy and paste values
xlSheet$Cells()$Copy()
xlSheet$Cells()$PasteSpecial(xlPasteValues)
xlApp[['CutCopyMode']] <- FALSE
xlSheet$Activate()
xlSheet$Range("A1")$Select()
}
}, error=function(e) {
print(e)
},
finally={
xlApp[['DisplayAlerts']] <- TRUE
# Save Changes
xlWB$Close(TRUE) # THIS WILL OVERWRITE (BACKUP IN TEST MODE)
xlApp$Quit()
# Release resources
xlSheet <- NULL
xlWB <- NULL
xlApp <- NULL
rm(list=ls())
gc()
}
)
}
由于 COM 是一项 Windows 技术,上述解决方案仅适用于 Windows 环境中的 R 运行。