使用openxlsx导入多个Excel工作表

时间:2015-04-06 20:46:43

标签: r excel

我正在尝试将大型xlsx文件导入到包含多张数据的R中。我试图通过XLConnect执行此操作,但java内存问题(例如in this thread所述的问题阻止了此技术的成功。)

相反,我正在尝试使用openxlsx包,我读过的包工作速度更快,完全避免使用Java。但有没有办法在循环中使用其read.xlsx函数将所有工作表读入单独的数据框?我与其他软件包一起使用的技术不再有效,不再使用loadWorkbook()getSheets()这样的bc命令。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

只需仔细阅读 openxlsx 的文档,就可以快速找到函数sheets(),它所声明的函数已被弃用,而不是names(),它返回所有名称工作簿中的工作表。然后,您可以在一个简单的for循环中迭代它们。

我不确定你为什么说不能使用loadWorkbook。同样,文档清楚地显示了该名称中 openxlsx 中的函数与 XLConnect 中的函数大致相同,尽管它的参数略有不同。

您还可以查看 readxl 包,该包也没有Java依赖关系。

答案 1 :(得分:0)

我认为getSheetNames()函数是使用的正确函数。它将为您提供文件中工作表名称的向量。然后,您可以遍历此列表以读取data.frames列表。

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)

答案 2 :(得分:-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)
}