如何在R中未读隐藏Excel工作表(read_excel)?

问题描述 投票:0回答:1

想知道是否有任何方法或技巧可以忽略Excel工作簿中隐藏的excel_sheet(read_excel)。

我问的原因是,有很多Excel文件,很多工作表都被隐藏了。

到目前为止我所尝试的内容参考下面的链接。

从 Excel 导入时如何忽略隐藏数据

r xlsx
1个回答
10
投票

这是一个函数,它将通知您要使用的任何函数,无论是

readxl::read_excel
还是其他。 (我已经用几个
.xlsx
文件对此进行了测试,但没有进行广泛的测试。)

这需要

xml2
包。

xlsx_sheet_info <- function(filename) {
  stopifnot(file.exists(filename))
  tmpdir <- tempfile(pattern = "xldir")
  fn <- try(
    utils::unzip(filename, files = "xl/workbook.xml", exdir = tmpdir, junkpaths = TRUE),
    silent = TRUE)
  if (inherits(fn, "try-error")) stop("unable to find 'xl/workbook.xml'")
  on.exit({
    # clean up our temporary directory used to extract the file
    if (dir.exists(tmpdir)) {
      suppressWarnings(unlink(tmpdir, recursive = TRUE, force = TRUE))
    }
  })
  xml <- try(xml2::read_xml(fn), silent = TRUE)
  if (inherits(xml, "try-error")) stop("unable to parse xml")
  # everything we want in sheets is stored as element attributes
  sheets <- lapply(xml2::as_list(xml)$workbook$sheets, attributes)
  nms <- unique(unlist(lapply(sheets, names)))
  out <- do.call(rbind.data.frame, lapply(sheets, function(sh) {
    # I believe attributes will always be 'character'
    sh[setdiff(nms, names(sh))] <- NA_character_
    # return them in-order, safe for 'rbind.data.frame'
    sh[nms]
  }))
  out[] <- lapply(out, type.convert, as.is = TRUE)
  out
}

我创建了一个简单的工作簿,其中包含三个工作表,具有不同级别的“隐藏”性:

xlSheetVisible
xlSheetHidden
xlSheetVeryHidden
(每个 Excel VBA 枚举)。

info <- xlsx_sheet_info("Book1.xlsx")
info
#          name sheetId   id      state
# sheet  Sheet1       1 rId1       <NA>
# sheet1 Sheet3       3 rId2 veryHidden
# sheet2 Sheet2       2 rId3     hidden

这是一个

data.frame
,因此您可以使用
is.na(info$state)
(或
grep
表示
"hidden"
)通过
name
sheetId
选择特定行(我假设这些是单调整数,与
 兼容) readxl::read_xlsx
和朋友)。

我不会假设工作表的顺序保留在行中,正如此处建议的那样。事实上,我按顺序创建了工作表:可见、隐藏、非常隐藏。

© www.soinside.com 2019 - 2024. All rights reserved.