test_that("Maintaining Named Regions on Load", {
## create named regions
wb <- wb_workbook()
wb$add_worksheet("Sheet 1")
wb$add_worksheet("Sheet 2")
## specify region
wb$add_data(sheet = 1, x = iris, start_col = 1, start_row = 1)
wb$add_named_region(
sheet = 1,
name = "iris",
dims = rowcol_to_dims(
seq_len(nrow(iris) + 1),
seq_len(ncol(iris)
)
)
)
## using write_data 'name' argument
wb$add_data(sheet = 1, x = iris, name = "iris2", start_col = 10)
## Named region size 1
wb$add_data(sheet = 2, x = 99, name = "region1", start_col = 3, start_row = 3)
## save file for testing
out_file <- temp_xlsx()
wb_save(wb, out_file, overwrite = TRUE)
expect_equal(
object = wb_get_named_regions(wb),
expected = wb_get_named_regions(wb_load(out_file))
)
df1 <- read_xlsx(wb, named_region = "iris")
df2 <- read_xlsx(out_file, named_region = "iris")
expect_equal(df1, df2)
df1 <- read_xlsx(wb, named_region = "region1", skip_empty_cols = FALSE)
expect_s3_class(df1, "data.frame")
expect_equal(nrow(df1), 0)
expect_equal(ncol(df1), 1)
df1 <- read_xlsx(wb, named_region = "region1", col_names = FALSE)
expect_s3_class(df1, "data.frame")
expect_equal(nrow(df1), 1)
expect_equal(ncol(df1), 1)
# nonsense
# df1 is a single value and this single value is now used as rowName
expect_warning(df1 <- read_xlsx(wb, named_region = "region1", row_names = TRUE))
expect_s3_class(df1, "data.frame")
expect_equal(nrow(df1), 0)
expect_equal(ncol(df1), 0)
})
test_that("Correctly Loading Named Regions Created in Excel", {
# Load an excel workbook (in the repo, it's located in the /inst folder;
# when installed on the user's system, it is located in the installation folder
# of the package)
filename <- testfile_path("namedRegions.xlsx")
# Load this workbook. We will test read_xlsx by passing both the object wb and
# the filename. Both should produce the same results.
wb <- wb_load(filename)
# NamedTable refers to Sheet1!$C$5:$D$8
table_f <- read_xlsx(filename,
named_region = "NamedTable"
)
table_w <- read_xlsx(wb,
named_region = "NamedTable"
)
expect_equal(object = table_f, expected = table_w)
expect_equal(object = class(table_f), expected = "data.frame")
expect_equal(object = ncol(table_f), expected = 2)
expect_equal(object = nrow(table_f), expected = 3)
# NamedCell refers to Sheet1!$C$2
# This proeduced an error in an earlier version of the pacage when the object
# wb was passed, but worked correctly when the filename was passed to read_xlsx
cell_f <- read_xlsx(filename,
named_region = "NamedCell",
col_names = FALSE,
row_names = FALSE
)
cell_w <- read_xlsx(wb,
named_region = "NamedCell",
col_names = FALSE,
row_names = FALSE
)
expect_equal(object = cell_f, expected = cell_w)
expect_equal(object = class(cell_f), expected = "data.frame")
expect_equal(object = NCOL(cell_f), expected = 1)
expect_equal(object = NROW(cell_f), expected = 1)
# NamedCell2 refers to Sheet1!$C$2:$C$2
cell2_f <- read_xlsx(filename,
named_region = "NamedCell2",
col_names = FALSE,
row_names = FALSE
)
cell2_w <- read_xlsx(wb,
named_region = "NamedCell2",
col_names = FALSE,
row_names = FALSE
)
expect_equal(object = cell2_f, expected = cell2_w)
expect_equal(object = class(cell2_f), expected = "data.frame")
expect_equal(object = NCOL(cell2_f), expected = 1)
expect_equal(object = NROW(cell2_f), expected = 1)
})
# Ordering locally and in testthat differs.
test_that("Load names from an Excel file with funky non-region names", {
filename <- testfile_path("namedRegions2.xlsx")
wb <- wb_load(filename)
dn <- wb_get_named_regions(wb)
expect_equal(
head(dn$name, 5),
c("IQ_CH", "IQ_CQ", "IQ_CY", "IQ_DAILY", "IQ_FH")
)
expect_equal(
dn$sheets,
c(rep("", 26), "Sheet1",
"Sheet with space", "Sheet1", "Sheet with space"
)
)
expect_equal(dn$coords, c(rep("", 26), "B3", "B4", "B4", "B3"))
dn2 <- wb_get_named_regions(wb_load(filename))
expect_equal(dn, dn2)
})
test_that("Missing rows in named regions", {
temp_file <- temp_xlsx()
wb <- wb_workbook()
wb$add_worksheet("Sheet 1")
## create region
wb$add_data(sheet = 1, x = iris[1:11, ], start_col = 1, start_row = 1)
expect_warning(
delete_data(wb, sheet = 1, cols = 1:2, rows = c(6, 6)),
"'delete_data' is deprecated."
)
expect_warning(
wb$add_named_region(
sheet = 1,
name = "iris",
rows = 1:(5 + 1),
cols = 1:2
),
"'cols/rows' is deprecated."
)
expect_warning(
wb$add_named_region(
sheet = 1,
name = "iris2",
rows = 1:(5 + 2),
cols = 1:2
),
"'cols/rows' is deprecated."
)
## iris region is rows 1:6 & cols 1:2
## iris2 region is rows 1:7 & cols 1:2
## row 6 columns 1 & 2 are blank
expect_equal(wb_get_named_regions(wb)$name, c("iris", "iris2"))
expect_equal(wb_get_named_regions(wb)$sheets, c("Sheet 1", "Sheet 1"))
expect_equal(wb_get_named_regions(wb)$coords, c("A1:B6", "A1:B7"))
######################################################################## from Workbook
## Skip empty rows
x <- read_xlsx(file = wb, named_region = "iris", col_names = TRUE, skip_empty_rows = TRUE)
expect_equal(dim(x), c(4, 2))
x <- read_xlsx(file = wb, named_region = "iris2", col_names = TRUE, skip_empty_rows = TRUE)
expect_equal(dim(x), c(5, 2))
## Keep empty rows
x <- read_xlsx(file = wb, named_region = "iris", col_names = TRUE, skip_empty_rows = FALSE)
expect_equal(dim(x), c(5, 2))
x <- read_xlsx(file = wb, named_region = "iris2", col_names = TRUE, skip_empty_rows = FALSE)
expect_equal(dim(x), c(6, 2))
######################################################################## from file
wb_save(wb, temp_file)
## Skip empty rows
x <- read_xlsx(file = temp_file, named_region = "iris", col_names = TRUE, skip_empty_rows = TRUE)
expect_equal(dim(x), c(4, 2))
x <- read_xlsx(file = temp_file, named_region = "iris2", col_names = TRUE, skip_empty_rows = TRUE)
expect_equal(dim(x), c(5, 2))
## Keep empty rows
x <- read_xlsx(file = temp_file, named_region = "iris", col_names = TRUE, skip_empty_rows = FALSE)
expect_equal(dim(x), c(5, 2))
x <- read_xlsx(file = temp_file, named_region = "iris2", col_names = TRUE, skip_empty_rows = FALSE)
expect_equal(dim(x), c(6, 2))
unlink(temp_file)
})
test_that("Missing columns in named regions", {
temp_file <- temp_xlsx()
wb <- wb_workbook()
wb$add_worksheet("Sheet 1")
## create region
wb$add_data(sheet = 1, x = iris[1:11, ], start_col = 1, start_row = 1)
expect_warning(
delete_data(wb, sheet = 1, cols = 2, rows = 1:12),
"'delete_data' is deprecated."
)
wb$add_named_region(
sheet = 1,
name = "iris",
dims = rowcol_to_dims(
1:5,
1:2
)
)
wb$add_named_region(
sheet = 1,
name = "iris2",
dims = rowcol_to_dims(
1:5,
1:3
)
)
## iris region is rows 1:5 & cols 1:2
## iris2 region is rows 1:5 & cols 1:3
## row 6 columns 1 & 2 are blank
expect_equal(wb_get_named_regions(wb)$name, c("iris", "iris2"), ignore_attr = TRUE)
expect_equal(wb_get_named_regions(wb)$sheets, c("Sheet 1", "Sheet 1"))
expect_equal(wb_get_named_regions(wb)$coords, c("A1:B5", "A1:C5"))
######################################################################## from Workbook
## Skip empty cols
x <- read_xlsx(file = wb, named_region = "iris", col_names = TRUE, skip_empty_cols = TRUE)
expect_equal(dim(x), c(4, 1))
x <- read_xlsx(file = wb, named_region = "iris2", col_names = TRUE, skip_empty_cols = TRUE)
expect_equal(dim(x), c(4, 2))
## Keep empty cols
x <- read_xlsx(file = wb, named_region = "iris", col_names = TRUE, skip_empty_cols = FALSE)
expect_equal(dim(x), c(4, 2))
x <- read_xlsx(file = wb, named_region = "iris2", col_names = TRUE, skip_empty_cols = FALSE)
expect_equal(dim(x), c(4, 3))
######################################################################## from file
wb_save(wb, temp_file)
## Skip empty cols
x <- read_xlsx(file = temp_file, named_region = "iris", col_names = TRUE, skip_empty_cols = TRUE)
expect_equal(dim(x), c(4, 1))
x <- read_xlsx(file = temp_file, named_region = "iris2", col_names = TRUE, skip_empty_cols = TRUE)
expect_equal(dim(x), c(4, 2))
## Keep empty cols
x <- read_xlsx(file = temp_file, named_region = "iris", col_names = TRUE, skip_empty_cols = FALSE)
expect_equal(dim(x), c(4, 2))
x <- read_xlsx(file = temp_file, named_region = "iris2", col_names = TRUE, skip_empty_cols = FALSE)
expect_equal(dim(x), c(4, 3))
unlink(temp_file)
})
test_that("Matching Substrings breaks reading named regions", {
temp_file <- temp_xlsx()
wb <- wb_workbook()
wb$add_worksheet("table")
wb$add_worksheet("table2")
t1 <- head(iris)
t1$Species <- as.character(t1$Species)
t2 <- head(mtcars)
wb$add_data(sheet = "table", x = t1, name = "t", start_col = 3, start_row = 12)
wb$add_data(sheet = "table2", x = t2, name = "t2", start_col = 5, start_row = 24, row_names = TRUE)
wb$add_data(sheet = "table", x = head(t1, 3), name = "t1", start_col = 9, start_row = 3)
wb$add_data(sheet = "table2", x = head(t2, 3), name = "t22", start_col = 15, start_row = 12, row_names = TRUE)
wb_save(wb, temp_file)
r1 <- wb_get_named_regions(wb)
expect_equal(r1$sheets, c("table", "table", "table2", "table2"))
expect_equal(r1$coords, c("C12:G18", "I3:M6", "E24:P30", "O12:Z15"))
expect_equal(r1$name, c("t", "t1", "t2", "t22"))
wb2 <- wb_load(temp_file)
r2 <- wb_get_named_regions(wb2)
expect_equal(r2$sheets, c("table", "table", "table2", "table2"))
expect_equal(r1$coords, c("C12:G18", "I3:M6", "E24:P30", "O12:Z15"))
expect_equal(r2$name, c("t", "t1", "t2", "t22"))
## read file named region
expect_equal(t1, read_xlsx(file = temp_file, named_region = "t"), ignore_attr = TRUE)
expect_equal(t2, read_xlsx(file = temp_file, named_region = "t2", row_names = TRUE), ignore_attr = TRUE)
expect_equal(head(t1, 3), read_xlsx(file = temp_file, named_region = "t1"), ignore_attr = TRUE)
expect_equal(head(t2, 3), read_xlsx(file = temp_file, named_region = "t22", row_names = TRUE), ignore_attr = TRUE)
## read Workbook named region
expect_equal(t1, read_xlsx(file = wb, named_region = "t"), ignore_attr = TRUE)
expect_equal(t2, read_xlsx(file = wb, named_region = "t2", row_names = TRUE), ignore_attr = TRUE)
expect_equal(head(t1, 3), read_xlsx(file = wb, named_region = "t1"), ignore_attr = TRUE)
expect_equal(head(t2, 3), read_xlsx(file = wb, named_region = "t22", row_names = TRUE), ignore_attr = TRUE)
unlink(temp_file)
})
test_that("Read namedRegion from specific sheet", {
filename <- system.file("extdata", "namedRegions3.xlsx", package = "openxlsx2")
named_r <- "MyRange"
sheets <- wb_load(filename)$get_sheet_names()
# read the correct sheets
expect_equal(data.frame(X1 = "S1A1", X2 = "S1B1", stringsAsFactors = FALSE), read_xlsx(filename, sheet = "Sheet1", named_region = named_r, row_names = FALSE, col_names = FALSE), ignore_attr = TRUE)
expect_equal(data.frame(X1 = "S2A1", X2 = "S2B1", stringsAsFactors = FALSE), read_xlsx(filename, sheet = which(sheets %in% "Sheet2"), named_region = named_r, row_names = FALSE, col_names = FALSE), ignore_attr = TRUE)
expect_equal(data.frame(X1 = "S3A1", X2 = "S3B1", stringsAsFactors = FALSE), read_xlsx(filename, sheet = "Sheet3", named_region = named_r, row_names = FALSE, col_names = FALSE), ignore_attr = TRUE)
# Warning: Workbook has no such named region. (Wrong named_region selected.)
expect_error(read_xlsx(filename, sheet = "Sheet2", named_region = "MyRage", row_names = FALSE, col_names = FALSE))
# Warning: Workbook has no such named region on this sheet. (Correct named_region, but wrong sheet selected.)
expect_error(read_xlsx(filename, sheet = "Sheet4", named_region = named_r, row_names = FALSE, col_names = FALSE))
})
test_that("Overwrite and delete named regions", {
temp_file <- temp_xlsx()
wb <- wb_workbook()
expect_null(wb_get_named_regions(wb))
wb$add_worksheet("Sheet 1")
expect_null(wb_get_named_regions(wb))
## create region
wb$add_data(1, iris[1:11, ], start_col = 1, start_row = 1, name = "iris")
exp <- data.frame(
name = "iris",
value = "'Sheet 1'!A1:E12",
sheets = "Sheet 1",
coords = "A1:E12",
id = 1L,
local = 0,
sheet = 1L,
stringsAsFactors = FALSE
)
expect_identical(wb_get_named_regions(wb), exp)
# no overwrite
expect_error(wb$add_data(1, iris[1:11, ], start_col = 1, start_row = 1, name = "iris"))
expect_error(wb$add_named_region(1, name = "iris", dims = rowcol_to_dims(1:5, 1:2)))
# overwrite
wb$add_named_region(1, name = "iris", dims = "A1:B5", overwrite = TRUE)
exp <- data.frame(
name = "iris",
# oh, why are these `'` and not `"`?
value = "'Sheet 1'!$A$1:$B$5",
# and this doesn't have the `'`?
sheets = "Sheet 1",
coords = "A1:B5",
id = 1L,
local = 0,
sheet = 1L,
stringsAsFactors = FALSE
)
# check modification
expect_identical(wb_get_named_regions(wb), exp)
# delete name region
wb$remove_named_region(name = "iris")
expect_false("iris" %in% wb_get_named_regions(wb)$name)
wb$add_named_region(1, name = "iris", dims = "A1:B5")
expect_identical(wb_get_named_regions(wb), exp)
# removing a worksheet removes the named region as well
wb <- wb_remove_worksheet(wb, 1)
expect_null(wb_get_named_regions(wb))
})
test_that("load table", {
wb <- wb_workbook()
# add a table
wb$add_worksheet("Sheet 1")
wb$add_data_table(sheet = "Sheet 1", x = iris, table_name = "iris_tab")
# add a named region
wb$add_worksheet("Sheet 2")
wb$add_data(sheet = "Sheet 2", x = iris, start_col = 1, start_row = 1)
wb$add_named_region(
sheet = 2,
name = "iris",
dims = rowcol_to_dims(
seq_len(nrow(iris) + 1),
seq_along(iris)
)
)
expect_equal(c("iris", "iris_tab"), wb_get_named_regions(wb, tables = TRUE)$name)
expect_equal(
wb_to_df(wb, named_region = "iris_tab"),
wb_to_df(wb, named_region = "iris")
)
})
test_that("wb_named_regions() is not too noisy in its deprecation. (#764)", {
wb <- wb_workbook()$add_worksheet()
temp_file <- temp_xlsx()
wb$save(temp_file)
# unacceptable input only possible after 1.0
expect_error(expect_warning(wb_get_named_regions(temp_file, x = 1)))
opt_deprecation <- getOption("openxlsx2.soon_deprecated")
op <- options("openxlsx2.soon_deprecated" = FALSE)
on.exit(options(op), add = TRUE)
wb <- wb_workbook()$add_worksheet()
temp_file <- temp_xlsx()
wb$save(temp_file)
expect_no_warning(wb_get_named_regions(temp_file))
expect_warning(wb_get_named_regions(x = temp_file))
options("openxlsx2.soon_deprecated" = TRUE)
expect_warning(wb_get_named_regions(temp_file))
expect_warning(expect_warning(wb_get_named_regions(x = temp_file)))
})
test_that("named regions work.", {
wb <- wb_workbook()$add_worksheet()$add_named_region(
name = "named_region",
dims = rowcol_to_dims(
row = 5:7,
col = 6:8
)
)
exp <- "'Sheet 1'!$F$5:$H$7"
got <- wb$workbook$definedNames
expect_equal(exp, got)
})
test_that("local_sheet works", {
wb <- wb_workbook()$
add_worksheet()$
add_named_region(
name = "foo",
dims = "A1",
local_sheet = TRUE
)$
add_worksheet()$
add_named_region(
name = "bar",
dims = "A1",
local_sheet = TRUE
)$
add_named_region(
sheet = 1,
name = "baz",
dims = "A2",
local_sheet = TRUE
)
exp <- c(
"'Sheet 1'!$A$1:$A$1",
"'Sheet 2'!$A$1:$A$1",
"'Sheet 1'!$A$2:$A$2"
)
got <- wb$workbook$definedNames
expect_equal(exp, got)
})