如何在 R(read_excel) 中隐藏 excel sheet?
How to unread hide excel sheet in R(read_excel)?
想知道有什么方法或技巧可以忽略excel工作簿(read_excel)中隐藏的excel_sheet。
为什么我要问的是,有很多 excel 文件隐藏在那么多工作表中。
我到目前为止所尝试的内容在下面提到 link。
How to ignore hidden data when importing from Excel
感谢任何帮助。
这是一个函数,它将 通知 您想要使用的任何函数,无论是 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
}
我创建了一个包含三个工作表的简单工作簿,具有不同级别的“隐藏”-ness:xlSheetVisible
、xlSheetHidden
和 xlSheetVeryHidden
(根据 ExcelVBA枚举)。
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
和朋友兼容)。
我会不会假设工作表的顺序保留在行中,正如此处所建议的那样。事实上,我按顺序创建了工作表:可见、隐藏、very-hidden.
想知道有什么方法或技巧可以忽略excel工作簿(read_excel)中隐藏的excel_sheet。
为什么我要问的是,有很多 excel 文件隐藏在那么多工作表中。
我到目前为止所尝试的内容在下面提到 link。
How to ignore hidden data when importing from Excel
感谢任何帮助。
这是一个函数,它将 通知 您想要使用的任何函数,无论是 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
}
我创建了一个包含三个工作表的简单工作簿,具有不同级别的“隐藏”-ness:xlSheetVisible
、xlSheetHidden
和 xlSheetVeryHidden
(根据 ExcelVBA枚举)。
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
和朋友兼容)。
我会不会假设工作表的顺序保留在行中,正如此处所建议的那样。事实上,我按顺序创建了工作表:可见、隐藏、very-hidden.