如何在R Excel Automation中跳过/处理空白页/无页纸?

时间:2019-04-03 10:10:05

标签: r excel automation

我正在尝试合并/绑定大量数据。该代码已编写并且可以正常工作。尝试合并没有工作表的数据时出现问题。有什么方法可以跳过错误?

library(tidyverse)
library(xlsx)

files <- list.files(pattern="*.xlsx")

read_Sheet_1 <- lapply(files, readxl::read_excel, sheet = "Sheet 1")
Sheet_1 = do.call(rbind, read_Sheet_1) 

read_Sheet_2 <- lapply(files, readxl::read_excel, sheet = "Sheet 2")
Sheet_2 = do.call(rbind, read_Sheet_2)

read_Sheet_3 <- lapply(files, readxl::read_excel, sheet = "Sheet 3")
Sheet_3 = do.call(rbind, read_Sheet_3) 

write.xlsx(as.data.frame(Sheet_1), file="Final.xlsx", sheetName="Sheet_1", row.names=FALSE)
write.xlsx(as.data.frame(Sheet_2), file="Final.xlsx", sheetName="Sheet_2", append=TRUE, row.names=FALSE)
write.xlsx(as.data.frame(Sheet_3), file="Final.xlsx", sheetName="Sheet_3", append=TRUE, row.names=FALSE)

预期结果:将每个工作表中的行合并到一个Final.xlsx文件中 实际结果:即使函数将行合并在一起。如果其中一个文件中只有2张纸,则会出现错误。示例:File3.xlsx中仅包含“ Sheet 1”和“ Sheet 3”,而不包含“ Sheet 2”。因此,这将为整个“ Sheet_2”数据帧引发错误。

1 个答案:

答案 0 :(得分:1)

您可以使用safely软件包中的purrr

library(tidyverse)
library(xlsx)

files <- list.files(pattern="*.xlsx")

read_excel_safe <- function(file, sheet) {
  read_excel_safely <- safely(readxl::read_excel, otherwise = NULL)
  read_excel_safely(file, sheet = sheet)$result
}

Sheet_1 <- files %>% 
  map(.f = read_excel_safe, sheet = 'Sheet 1') %>% 
  reduce(rbind) 

函数read_excel_safely将返回带有错误和结果的命名列表。如果有错误,结果将为NULL。并且执行缩小步骤时,它应该影响rbind