3个回答

8

我认为getSheetNames()函数是正确的函数。它会给你一个向量,其中包含文件中工作表的名称。然后,您可以在此列表上循环以读取数据框列表。

read_all_sheets = function(xlsxFile, ...) {
  sheet_names = openxlsx::getSheetNames(xlsxFile)
  sheet_list = as.list(rep(NA, length(sheet_names)))
  names(sheet_list) = sheet_names
  for (sn in sheet_names) {
    sheet_list[[sn]] = openxlsx::read.xlsx(xlsxFile, sheet=sn, ...)
  }
  return(sheet_list)
}

read_all_sheets(myxlsxFile)

7

仅仅浏览 openxlsx 文档,您就会快速找到函数 sheets()。文档中指出该函数已被取消,取而代之的是函数 names() 以返回工作簿中所有工作表的名称。您可以在一个简单的 for 循环中迭代它们。

我不确定为什么您说不能使用 loadWorkbook。再次查看文档,openxlsx 明确显示了名为 loadWorkbook 的函数,它与 XLConnect 中执行的功能大致相同,尽管其参数略有不同。

您也可以查看 readxl 包,它也没有 Java 依赖性。


好的,谢谢。抱歉,我粗心大意没有注意到openxlsx中有类似的命令。我只是在严格参考XLConnect函数。 - Z_D
@Tony 不用担心。很高兴我能帮到你! - joran

1
"

'sapply'也可以被使用。

"
read_all_sheets = function(xlsxFile, ...) {
  sheet_names = openxlsx::getSheetNames(xlsxFile)
  sheet_list = sapply(sheet_names, function(sn){openxlsx::read.xlsx(xlsxFile, sheet=sn, ...)}, USE.NAMES = TRUE)
 return(sheet_list)
}

我喜欢这个解决方案的紧凑性! - dhd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接