testsetup() test_that("Workbook class", { expect_null(assert_workbook(wb_workbook())) }) test_that("wb_set_col_widths works", { # TODO use wb$wb_set_col_widths() wb <- wbWorkbook$new() wb$add_worksheet("test") wb$add_data("test", mtcars) # set column width to 12 expect_silent(wb$set_col_widths("test", widths = 12L, cols = seq_along(mtcars))) expect_equal( wb$worksheets[[1]]$cols_attr, "" ) # wrong sheet expect_error(wb$set_col_widths("test2", widths = 12L, cols = seq_along(mtcars))) # reset the column with, we do not provide an option ot remove the column entry expect_silent(wb$set_col_widths("test", cols = seq_along(mtcars))) expect_equal( wb$worksheets[[1]]$cols_attr, "" ) # create column width for column 25 expect_silent(wb$set_col_widths("test", cols = "Y", widths = 22)) expect_equal( c("", "", ""), wb$worksheets[[1]]$cols_attr ) wb <- wb_workbook()$ add_worksheet()$ set_col_widths(cols = 1:10, widths = (8:17) + .5)$ add_data(x = rbind(8:17), col_names = FALSE) exp <- c( "", "", "", "", "", "", "", "", "", "" ) got <- wb$worksheets[[1]]$cols_attr expect_equal(exp, got) wb <- wb_workbook()$add_worksheet() wb$worksheets[[1]]$cols_attr <- c( "", "" ) expect_silent(wb$set_col_widths(cols = 19, widths = 9)) }) test_that("set_col_widths informs when inconsistent lengths are supplied", { wb <- wbWorkbook$new() wb$add_worksheet("test") expect_warning(wb$set_col_widths(cols = c(1, 2, 3), widths = c(2, 3)), "compatible length") expect_error(wb$set_col_widths(cols = "Y", widths = 1:2), "More widths than column") expect_error(wb$set_col_widths("test", cols = "Y", hidden = 1:2), "hidden argument is longer") expect_warning(wb$set_col_widths(cols = c("X", "Y", "Z"), hidden = c(1, 0)), "compatible length") }) test_that("option maxWidth works", { op <- options("openxlsx2.maxWidth" = 6) on.exit(options(op), add = TRUE) wb <- wb_workbook()$add_worksheet()$add_data(x = data.frame( x = paste0(letters, collapse = ""), y = paste0(letters, collapse = "") ))$set_col_widths(cols = 1:2, widths = "auto") exp <- "" got <- wb$worksheets[[1]]$cols_attr expect_equal(exp, got) }) # order ------------------------------------------------------------------- test_that("$set_order() works", { wb <- wb_workbook() wb$add_worksheet("a") wb$add_worksheet("b") wb$add_worksheet("c") expect_identical(wb$sheetOrder, 1:3) exp <- letters[1:3] names(exp) <- exp expect_identical(wb$get_sheet_names(), exp) wb$set_order(3:1) expect_identical(wb$sheetOrder, 3:1) exp <- letters[3:1] names(exp) <- exp expect_identical(wb$get_sheet_names(), exp) }) # sheet names ------------------------------------------------------------- test_that("$set_sheet_names() and $get_sheet_names() work", { wb <- wb_workbook()$add_worksheet()$add_worksheet() wb$set_sheet_names(new = c("a", "b & c")) # return a names character vector res <- wb$get_sheet_names() exp <- c(a = "a", "b & c" = "b & c") expect_identical(res, exp) # return a names character vector res <- wb$get_sheet_names(escape = TRUE) exp <- c(a = "a", "b & c" = replace_legal_chars("b & c")) expect_identical(res, exp) # should be able to check the original values, too res <- wb$.__enclos_env__$private$get_sheet_index("b & c") expect_identical(res, 2L) # make sure that it works silently wb <- wb_load(file = system.file("extdata", "oxlsx2_sheet.xlsx", package = "openxlsx2")) expect_silent(wb$set_sheet_names(old = "SUM", new = "Sheet 1")) exp <- c(`Sheet 1` = "Sheet 1") got <- wb$get_sheet_names() expect_equal(exp, got) }) # data validation --------------------------------------------------------- test_that("data validation", { temp <- temp_xlsx() df <- data.frame( "d" = as.Date("2016-01-01") + -5:5, "t" = as.POSIXct("2016-01-01") + -5:5 * 10000 ) wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data_table(x = iris)$ # whole numbers are fine add_data_validation(dims = "A2:C151", type = "whole", operator = "between", value = c(1, 9) )$ # text width 7-9 is fine add_data_validation(dims = "E2:E151", type = "textLength", operator = "between", value = c(7, 9) )$ ## Date and Time cell validation add_worksheet("Sheet 2")$ add_data_table(x = df)$ # date >= 2016-01-01 is fine add_data_validation(dims = "A2:A12", type = "date", operator = "greaterThanOrEqual", value = as.Date("2016-01-01") )$ # a few timestamps are fine add_data_validation(dims = "B2:B12", type = "time", operator = "between", value = df$t[c(4, 8)] )$ ## validate list: validate inputs on one sheet with another add_worksheet("Sheet 3")$ add_data_table(x = iris[1:30, ])$ add_worksheet("Sheet 4")$ add_data(x = sample(iris$Sepal.Length, 10))$ add_data_validation("Sheet 3", dims = "A2:A31", type = "list", value = "'Sheet 4'!$A$1:$A$10") exp <- c( "19", "79" ) got <- wb$worksheets[[1]]$dataValidations expect_equal(exp, got) exp <- c( "42370", "42369.768518518542370.2314814815" ) got <- wb$worksheets[[2]]$dataValidations expect_equal(exp, got) exp <- c( "'Sheet 4'!$A$1:$A$10" ) got <- wb$worksheets[[3]]$dataValidations expect_equal(exp, got) wb$save(temp) wb2 <- wb_load(temp) # wb2$add_data_validation("Sheet 3", col = 2, rows = 2:31, type = "list", # value = "'Sheet 4'!$A$1:$A$10") # wb2$save(temp) expect_equal( wb$worksheets[[1]]$dataValidations, wb2$worksheets[[1]]$dataValidations ) expect_equal( wb$worksheets[[2]]$dataValidations, wb2$worksheets[[2]]$dataValidations ) expect_equal( wb$worksheets[[3]]$dataValidations, wb2$worksheets[[3]]$dataValidations ) expect_warning( wb2$add_data_validation("Sheet 3", cols = 2, rows = 2:31, type = "list", value = "'Sheet 4'!$A$1:$A$10"), "'cols/rows' is deprecated." ) exp <- c( "'Sheet 4'!$A$1:$A$10", "'Sheet 4'!$A$1:$A$10" ) got <- wb2$worksheets[[3]]$dataValidations expect_equal(exp, got) ### tests if conditions # test col2int expect_warning( wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data_table(x = head(iris))$ # whole numbers are fine add_data_validation(cols = "A", rows = 2:151, type = "whole", operator = "between", value = c(1, 9) ), "'cols/rows' is deprecated." ) exp <- "19" got <- wb$worksheets[[1]]$dataValidations expect_equal(exp, got) # to many values expect_error( wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data_table(x = head(iris))$ add_data_validation(dims = "A2:A151", type = "whole", operator = "between", value = c(1, 9, 19) ), "length <= 2" ) # wrong type expect_error( wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data_table(x = head(iris))$ add_data_validation(dims = "A2:A151", type = "even", operator = "between", value = c(1, 9) ), "Invalid 'type' argument!" ) # wrong operator expect_error( wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data_table(x = head(iris))$ add_data_validation(dims = "A2:A151", type = "whole", operator = "lower", value = c(1, 9) ), "Invalid 'operator' argument!" ) # wrong value for date expect_error( wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data_table(x = head(iris))$ # whole numbers are fine add_data_validation(dims = "A2:A12", type = "date", operator = "greaterThanOrEqual", value = 7 ), "If type == 'date' value argument must be a Date vector" ) # wrong value for time expect_error( wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data_table(x = head(iris))$ # whole numbers are fine add_data_validation(dims = "A2:A12", type = "time", operator = "greaterThanOrEqual", value = 7 ), "If type == 'time' value argument must be a POSIXct or POSIXlt vector." ) # some more options wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data(x = c(-1:1), colNames = FALSE)$ # whole numbers are fine add_data_validation(dims = "A1:A3", type = "whole", operator = "greaterThan", value = c(0), errorStyle = "information", errorTitle = "ERROR!", error = "Some error ocurred!", promptTitle = "PROMPT!", prompt = "Choose something!" ) exp <- "0" got <- wb$worksheets[[1]]$dataValidations expect_equal(exp, got) # add custom data wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_data(x = data.frame(x = 1, y = 2), colNames = FALSE)$ # whole numbers are fine add_data_validation(dims = "A1:A3", type = "custom", value = "A1=B1") exp <- "A1=B1" got <- wb$worksheets[[1]]$dataValidations expect_equal(exp, got) }) test_that("clone worksheet", { ## Dummy tests - not sure how to test these from R ## # # clone chartsheet ---------------------------------------------------- fl <- testfile_path("mtcars_chart.xlsx") wb <- wb_load(fl) # wb$get_sheet_names() # chartsheet has no named name? expect_silent(wb$clone_worksheet(1, "Clone 1")) expect_s3_class(wb$worksheets[[5]], "wbChartSheet") # wb$open() # clone pivot table and drawing ----------------------------------------- fl <- testfile_path("loadExample.xlsx") wb <- wb_load(fl) expect_silent(wb$clone_worksheet(4, "Clone 1")) # sheets 4 & 5 both reference the same pivot table in different drawing # once the file is opened, both pivot tables behave independently exp <- c( "", "" ) got <- wb$worksheets_rels[[5]] expect_equal(exp, got) # wb$open() # clone drawing --------------------------------------------------------- wb <- wb_load(fl) expect_silent(wb$clone_worksheet("testing", "Clone1")) expect_false(identical(wb$worksheets_rels[2], wb$worksheets_rels[5])) # wb$open() # clone sheet with table ------------------------------------------------ fl <- testfile_path("tableStyles.xlsx") wb <- wb_load(fl) expect_silent(wb$clone_worksheet(1, "clone")) expect_false(identical(wb$tables$tab_xml[1], wb$tables$tab_xml[2])) # wb$open() # clone sheet with chart ------------------------------------------------ fl <- testfile_path("mtcars_chart.xlsx") wb <- wb_load(fl) wb$clone_worksheet(2, "Clone 1") expect_true(grepl("test", wb$charts$chart[2])) expect_true(grepl("'Clone 1'", wb$charts$chart[3])) # wb$open() # clone slicer ---------------------------------------------------------- fl <- testfile_path("loadExample.xlsx") wb <- wb_load(fl) expect_warning(wb$clone_worksheet("IrisSample", "Clone1"), "Cloning slicers is not yet supported. It will not appear on the sheet.") # wb$open() }) test_that("set and remove row heights work", { ## add row heights wb <- wb_workbook()$ add_worksheet()$ set_row_heights( rows = c(1, 4, 22, 2, 19), heights = c(24, 28, 32, 42, 33) ) exp <- structure( list( customHeight = c("1", "1", "1", "1", "1"), ht = c("24", "42", "28", "33", "32"), r = c("1", "2", "4", "19", "22") ), row.names = c(1L, 2L, 4L, 19L, 22L), class = "data.frame" ) got <- wb$worksheets[[1]]$sheet_data$row_attr[c(1, 2, 4, 19, 22), c("customHeight", "ht", "r")] expect_equal(exp, got) ## remove row heights wb$remove_row_heights(rows = 1:21) exp <- structure( list( customHeight = c("", "", "", "", "1"), ht = c("", "", "", "", "32"), r = c("1", "2", "4", "19", "22") ), row.names = c(1L, 2L, 4L, 19L, 22L), class = "data.frame" ) got <- wb$worksheets[[1]]$sheet_data$row_attr[c(1, 2, 4, 19, 22), c("customHeight", "ht", "r")] expect_equal(exp, got) expect_warning( wb$add_worksheet()$remove_row_heights(rows = 1:3), "There are no initialized rows on this sheet" ) wb <- wb_workbook()$ add_worksheet()$ add_data(x = mtcars)$ set_row_heights(rows = 5:15, hidden = TRUE) exp <- structure( c(22L, `1` = 11L), dim = 2L, dimnames = structure( list( c("", "1") ), names = "" ), class = "table" ) got <- table(wb$worksheets[[1]]$sheet_data$row_attr$hidden) expect_equal(exp, got) }) test_that("add_drawing works", { skip_if_not_installed("rvg") skip_if_not_installed("ggplot2") require(rvg) require(ggplot2) tmp <- tempfile(fileext = "drawing.xml") ## rvg example dml_xlsx(file = tmp, fonts = list(sans = "Bradley Hand")) print( ggplot(data = iris, mapping = aes(x = Sepal.Length, y = Petal.Width)) + geom_point() + labs(title = "With font Bradley Hand") + theme_minimal(base_family = "sans", base_size = 18) ) dev.off() wb <- wb_workbook()$ add_worksheet()$ add_drawing(xml = tmp)$ add_drawing(xml = tmp, dims = "A1:H10")$ add_drawing(xml = tmp, dims = "L1")$ add_drawing(xml = tmp, dims = NULL)$ add_drawing(xml = tmp, dims = "L19") expect_length(wb$drawings, 1L) img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") expect_silent(wb$add_image(file = img)) }) test_that("add_drawing works", { skip_if_not_installed("mschart") require(mschart) # write data starting at B2 wb <- wb_workbook()$add_worksheet()$ add_data(x = mtcars, dims = "B2")$ add_data(x = data.frame(name = rownames(mtcars)), dims = "A2") # create wb_data object this will tell this mschart from this PR to create a file corresponding to openxlsx2 dat <- wb_data(wb, 1) expect_equal(c(32L, 12L), dim(dat)) dat <- wb_data(wb, 1, dims = "A2:G6") exp <- structure( list( name = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive"), mpg = c(21, 21, 22.8, 21.4), cyl = c(6, 6, 4, 6), disp = c(160, 160, 108, 258), hp = c(110, 110, 93, 110), drat = c(3.9, 3.9, 3.85, 3.08), wt = c(2.62, 2.875, 2.32, 3.215) ), row.names = 3:6, class = c("wb_data", "data.frame"), dims = structure( list( A = c("A2", "A3", "A4", "A5", "A6"), B = c("B2", "B3", "B4", "B5", "B6"), C = c("C2", "C3", "C4", "C5", "C6"), D = c("D2", "D3", "D4", "D5", "D6"), E = c("E2", "E3", "E4", "E5", "E6"), F = c("F2", "F3", "F4", "F5", "F6"), G = c("G2", "G3", "G4", "G5", "G6") ), row.names = 2:6, class = "data.frame"), sheet = "Sheet 1") expect_equal(exp, dat) # call ms_scatterplot scatter_plot <- ms_scatterchart( data = dat, x = "mpg", y = c("disp", "hp"), labels = c("disp", "hp") ) # add the scatterplots to the data wb <- wb %>% wb_add_mschart(dims = "F4:L20", graph = scatter_plot) expect_equal(NROW(wb$charts), 1L) chart_01 <- ms_linechart( data = us_indus_prod, x = "date", y = "value", group = "type" ) wb$add_worksheet() wb$add_mschart(dims = "F4:L20", graph = chart_01) exp <- list( "", "" ) got <- wb$drawings_rels expect_equal(exp, got) # write data starting at B2 wb <- wb_workbook()$ add_worksheet()$add_data(x = mtcars)$ add_worksheet()$add_data(x = mtcars)$ add_worksheet()$add_data(x = mtcars)$ add_worksheet()$add_data(x = mtcars)$ add_mschart(dims = "F4:L20", 2, graph = chart_01)$ add_mschart(dims = "F4:L20", 3, graph = chart_01) exp <- list( character(0), "", "", character(0) ) got <- wb$worksheets_rels expect_equal(exp, got) ## write different anchors wb <- wb_workbook()$ add_worksheet()$add_data(x = mtcars) scatter_plot <- ms_scatterchart( data = wb_data(wb), x = "mpg", y = c("disp", "hp") ) wb$ add_mschart(graph = scatter_plot)$ add_mschart(dims = "A1", graph = scatter_plot)$ add_mschart(dims = "F4:L20", graph = scatter_plot) expect_true(grepl("absoluteAnchor", wb$drawings)) expect_true(grepl("oneCellAnchor", wb$drawings)) expect_true(grepl("twoCellAnchor", wb$drawings)) }) test_that("add_chartsheet works", { skip_if_not_installed("mschart") require(mschart) wb <- wb_workbook()$ add_worksheet("A & B")$ add_data(x = mtcars)$ add_chartsheet(tabColour = "red") dat <- wb_data(wb, 1, dims = "A1:E6") # call ms_scatterplot data_plot <- ms_scatterchart( data = dat, x = "mpg", y = c("disp", "hp"), labels = c("disp", "hp") ) wb$add_mschart(graph = data_plot) expect_equal(nrow(wb$charts), 1) expect_true(grepl("A & B", wb$charts$chart)) expect_true(wb$is_chartsheet[[2]]) # add new worksheet and replace chart on chartsheet wb$add_worksheet()$add_data(x = mtcars) dat <- wb_data(wb, dims = "A1:E1;A7:E15") data_plot <- ms_scatterchart( data = dat, x = "mpg", y = c("disp", "hp"), labels = c("disp", "hp") ) wb$add_mschart(sheet = 2, graph = data_plot) expect_equal(nrow(wb$charts), 2L) exp <- "xdr:absoluteAnchor" got <- xml_node_name(unlist(wb$drawings), "xdr:wsDr") expect_equal(exp, got) }) test_that("multiple charts on a sheet work as expected", { skip_if_not_installed("mschart") require(mschart) ## Add mschart to worksheet (adds data and chart) scatter <- ms_scatterchart( data = iris, x = "Sepal.Length", y = "Sepal.Width", group = "Species" ) scatter <- chart_settings(scatter, scatterstyle = "marker") wb <- wb_workbook() %>% wb_add_worksheet() %>% wb_add_mschart(dims = "F4:L20", graph = scatter) %>% wb_add_mschart(dims = "F24:L40", graph = scatter) %>% wb_add_worksheet() %>% wb_add_mschart(dims = "F4:L20", graph = scatter) %>% wb_add_mschart(dims = "F24:L40", graph = scatter) exp <- c(TRUE, TRUE) got <- grepl(pattern = "", wb$drawings) expect_equal(exp, got) got <- grepl(pattern = "", wb$drawings) expect_equal(exp, got) }) test_that("various image functions work as expected", { img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") wb <- wb_workbook()$ add_worksheet()$ add_image(file = img, width = 6, height = 5, dims = NULL)$ add_worksheet()$ add_image(dims = "B2", file = img, rowOffset = 90000, colOffset = 90000)$ add_worksheet()$ add_image(dims = "B2:K8", file = img) exp <- c("xdr:absoluteAnchor", "xdr:oneCellAnchor", "xdr:twoCellAnchor") got <- wb$drawings %>% xml_node_name(level1 = "xdr:wsDr") expect_equal(exp, got) exp <- "190000190000" got <- wb$drawings[[2]] %>% xml_node("xdr:wsDr", "xdr:oneCellAnchor", "xdr:from") expect_equal(exp, got) exp <- "1010" got <- wb$drawings[[3]] %>% xml_node("xdr:wsDr", "xdr:twoCellAnchor", "xdr:from") expect_equal(exp, got) exp <- "11080" got <- wb$drawings[[3]] %>% xml_node("xdr:wsDr", "xdr:twoCellAnchor", "xdr:to") expect_equal(exp, got) expect_warning( wb$add_worksheet()$add_image(file = img, width = 6, height = 5, dims = NULL, startRow = 2, startCol = 2), "'start_col/start_row' is deprecated." ) }) test_that("image relships work with comment", { wb <- wb_workbook() wb$add_worksheet("Sheet 1") c1 <- wb_comment(text = "this is a comment", author = "", visible = TRUE) wb$add_comment(dims = "B12", comment = c1) img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") wb$add_image("Sheet 1", dims = "C5", file = img, width = 6, height = 5) exp <- "" got <- wb$worksheets[[1]]$drawing expect_equal(exp, got) }) test_that("start_col/start_row works as expected", { img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") expect_warning(wb <- wb_workbook()$add_worksheet()$add_image(file = img, start_row = 5), "'start_col/start_row' is deprecated.") exp <- "0040" got <- xml_node(wb$drawings[[1]], "xdr:wsDr", "xdr:oneCellAnchor", "xdr:from") expect_equal(exp, got) img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") expect_warning(wb <- wb_workbook()$add_worksheet()$add_image(file = img, startRow = 5), "'start_col/start_row' is deprecated.") exp <- "0040" got <- xml_node(wb$drawings[[1]], "xdr:wsDr", "xdr:oneCellAnchor", "xdr:from") expect_equal(exp, got) img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") expect_warning(wb <- wb_workbook()$add_worksheet()$add_image(file = img, start_col = 5), "'start_col/start_row' is deprecated.") exp <- "4000" got <- xml_node(wb$drawings[[1]], "xdr:wsDr", "xdr:oneCellAnchor", "xdr:from") expect_equal(exp, got) img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") expect_warning(wb <- wb_workbook()$add_worksheet()$add_image(file = img, startCol = 5), "'start_col/start_row' is deprecated.") exp <- "4000" got <- xml_node(wb$drawings[[1]], "xdr:wsDr", "xdr:oneCellAnchor", "xdr:from") expect_equal(exp, got) img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") expect_warning(wb <- wb_workbook()$add_worksheet()$add_image(file = img, start_col = 5, start_row = 5), "'start_col/start_row' is deprecated.") exp <- "4040" got <- xml_node(wb$drawings[[1]], "xdr:wsDr", "xdr:oneCellAnchor", "xdr:from") expect_equal(exp, got) img <- system.file("extdata", "einstein.jpg", package = "openxlsx2") expect_warning(wb <- wb_workbook()$add_worksheet()$add_image(file = img, startCol = 5, startRow = 5), "'start_col/start_row' is deprecated.") exp <- "4040" got <- xml_node(wb$drawings[[1]], "xdr:wsDr", "xdr:oneCellAnchor", "xdr:from") expect_equal(exp, got) }) test_that("workbook themes work", { wb <- wb_workbook()$add_worksheet() exp <- "Aptos Narrow" got <- wb$get_base_font()$name$val expect_equal(exp, got) wb <- wb_workbook(theme = "Office 2013 - 2022 Theme")$add_worksheet() exp <- "Calibri" got <- wb$get_base_font()$name$val expect_equal(exp, got) wb <- wb_workbook(theme = "Old Office Theme")$add_worksheet() exp <- "Calibri" got <- wb$get_base_font()$name$val expect_equal(exp, got) wb <- wb_workbook(theme = 1)$add_worksheet() exp <- "Rockwell" got <- wb$get_base_font()$name$val expect_equal(exp, got) expect_message( wb <- wb_workbook(theme = "Foo")$add_worksheet(), "theme Foo not found falling back to default theme" ) exp <- "Aptos Narrow" got <- wb$get_base_font()$name$val expect_equal(exp, got) }) test_that("changing sheet names works with named regions", { filename <- testfile_path("namedRegions2.xlsx") wb <- wb_load(filename) wb$set_sheet_names("Sheet1", "new name") wb$set_sheet_names("Sheet with space", "Sheet_without_space") exp <- c( "'Sheet_without_space'!$B$4", "'new name'!$B$4" ) got <- wb$workbook$definedNames[seq_len(2)] expect_equal(exp, got) }) test_that("numfmt in pivot tables works", { ## example code df <- data.frame( Plant = c("A", "C", "C", "B", "B", "C", "C", "C", "A", "C"), Location = c("E", "F", "E", "E", "F", "E", "E", "G", "E", "F"), Status = c("good", "good", "good", "good", "good", "good", "good", "good", "good", "bad"), Units = c(0.95, 0.95, 0.95, 0.95, 0.89, 0.89, 0.94, 0.94, 0.9, 0.9), stringsAsFactors = FALSE ) ## Create the workbook and the pivot table wb <- wb_workbook()$ add_worksheet("Data")$ add_data(x = df, startCol = 1, startRow = 2) df <- wb_data(wb, 1, dims = "A2:D10") wb$ add_pivot_table(df, dims = "A3", rows = "Plant", filter = c("Location", "Status"), data = "Units")$ add_pivot_table(df, dims = "A3", rows = "Plant", filter = c("Location", "Status"), data = "Units", params = list(numfmt = c(formatCode = "#,###0"), sort_row = "ascending"))$ add_pivot_table(df, dims = "A3", rows = "Plant", filter = c("Location", "Status"), data = "Units", params = list(numfmt = c(numfmt = 10), sort_row = "descending")) exp <- c( "", "", "" ) got <- xml_node(wb$pivotTables, "pivotTableDefinition", "dataFields", "dataField") expect_equal(exp, got) ## sort by column and row df <- mtcars ## Create the workbook and the pivot table wb <- wb_workbook()$ add_worksheet("Data")$ add_data(x = df, start_col = 1, start_row = 2) df <- wb_data(wb) wb$add_pivot_table(df, dims = "A3", rows = "cyl", cols = "gear", data = c("vs", "am"), params = list(sort_row = 1, sort_col = -2)) wb$add_pivot_table(df, dims = "A3", rows = "gear", filter = c("cyl"), data = c("vs", "am"), params = list(sort_row = "descending")) exp <- c( "", "" ) got <- xml_node(wb$pivotTables[1], "pivotTableDefinition", "pivotFields", "pivotField")[c(2, 10)] expect_equal(exp, got) expect_warning( wb$add_pivot_table(df, dims = "A3", rows = "cyl", cols = "gear", data = c("vs", "am"), params = list(sort_row = 1, sort_col = -7)), "invalid sort position found" ) expect_error( wb$add_pivot_table(df, dims = "A3", rows = "cyl", cols = "gear", data = c("vs", "am"), params = list(numfmt = c(numfmt = 10))), "length of numfmt and data does not match" ) ### add sortType only to those pivot fields that are sorted ## sort by column and row df <- mtcars ## Create the workbook and the pivot table wb <- wb_workbook()$ add_worksheet("Data")$ add_data(x = df, start_col = 1, start_row = 2) df <- wb_data(wb) wb$add_pivot_table( df, dims = "A3", rows = c("cyl", "am"), cols = c("gear", "carb"), data = c("disp", "mpg"), params = list(sort_row = 1, sort_col = -2) ) exp <- c("", "ascending", "", "", "", "", "", "", "", "descending", "") got <- rbindlist(xml_attr(wb$pivotTables, "pivotTableDefinition", "pivotFields", "pivotField"))$sortType expect_equal(exp, got) }) test_that("sort_item with pivot tables works", { wb <- wb_workbook() %>% wb_add_worksheet() %>% wb_add_data(x = mtcars) df <- wb_data(wb, sheet = 1) expect_silent( wb_add_pivot_table(wb, df, dims = "A3", filter = "am", rows = "cyl", cols = "gear", data = "disp", params = list(sort_item = list(gear = c(3, 2, 1))) ) ) expect_warning( wb_add_pivot_table(wb, df, dims = "A3", filter = "am", rows = "cyl", cols = "gear", data = "disp", params = list(sort_item = list(gear = seq_len(4))) ), "Length of sort order for 'gear' does not match required length. Is 4, needs 3." ) }) test_that("wbWorkbook print works", { wb <- wb_workbook()$ add_worksheet("Sheet 1")$ add_worksheet("Sheet 1 (1)")$ add_worksheet("Sheet & NoSheet") exp <- c("A Workbook object.", " ", "Worksheets:", " Sheets: Sheet 1, Sheet 1 (1), Sheet & NoSheet ", " Write order: 1, 2, 3") got <- capture.output(wb) expect_equal(exp, got) }) test_that("genBaseWorkbook() works", { # kinda superfluous. if it wouldn't work openxlsx2 would be broken exp <- c( "fileVersion", "fileSharing", "workbookPr", "alternateContent", "revisionPtr", "absPath", "workbookProtection", "bookViews", "sheets", "functionGroups", "externalReferences", "definedNames", "calcPr", "oleSize", "customWorkbookViews", "pivotCaches", "smartTagPr", "smartTagTypes", "webPublishing", "fileRecoveryPr", "webPublishObjects", "extLst" ) expect_equal( names(genBaseWorkbook()), exp ) }) test_that("subsetting wb_data() works", { wb <- wb_workbook()$ add_worksheet()$ add_data(x = head(esoph, 3)) df1 <- wb_data(wb) exp <- data.frame(alcgp = rep("0-39g/day", 3), stringsAsFactors = FALSE) got <- df1[, 2, drop = FALSE] expect_equal(exp, got, ignore_attr = TRUE) exp <- rep("0-39g/day", 3) got <- unclass(df1[, 2]) expect_equal(exp, got) exp <- structure( list( agegp = c("25-34", "25-34"), alcgp = c("0-39g/day", "0-39g/day") ), row.names = 2:3, dims = structure( list( A = c("A1", "A2", "A3"), B = c("B1", "B2", "B3") ), row.names = c(NA, 3L), class = "data.frame"), sheet = "Sheet 1" ) got <- unclass(df1[1:2, 1:2]) expect_equal(exp, got) expect_null(attributes(df1[c("agegp")])) exp <- list( names = "agegp", row.names = 2:4, class = c("wb_data", "data.frame"), dims = structure( list(A = c("A1", "A2", "A3", "A4")), row.names = c(NA, 4L), class = "data.frame" ), sheet = "Sheet 1" ) got <- attributes(df1[c("agegp"), drop = FALSE]) expect_equal(exp, got) exp <- list( names = c("alcgp", "tobgp", "ncases"), row.names = 2:4, class = c("wb_data", "data.frame"), dims = structure( list( B = c("B1", "B2", "B3", "B4"), C = c("C1", "C2", "C3", "C4"), D = c("D1", "D2", "D3", "D4") ), row.names = c(NA, 4L), class = "data.frame" ), sheet = "Sheet 1" ) got <- attributes(df1[c("alcgp", "tobgp", "ncases")]) expect_equal(exp, got) exp <- list( names = c("agegp", "alcgp", "tobgp", "ncases", "ncontrols"), row.names = 3:4, class = c("wb_data", "data.frame"), dims = structure( list( A = c("A1", "A3", "A4"), B = c("B1", "B3", "B4"), C = c("C1", "C3", "C4"), D = c("D1", "D3", "D4"), E = c("E1", "E3", "E4") ), row.names = c(1L, 3L, 4L), class = "data.frame" ), sheet = "Sheet 1" ) got <- attributes(df1[-1, ]) expect_equal(exp, got) exp <- list( names = c("agegp", "alcgp", "tobgp", "ncases", "ncontrols"), row.names = 2:3, class = c("wb_data", "data.frame"), dims = structure( list( A = c("A1", "A2", "A3"), B = c("B1", "B2", "B3"), C = c("C1", "C2", "C3"), D = c("D1", "D2", "D3"), E = c("E1", "E2", "E3") ), row.names = c(NA, 3L), class = "data.frame" ), sheet = "Sheet 1") got <- attributes(df1[-nrow(df1), ]) expect_equal(exp, got) }) test_that("adding mips section works", { # helper function to mock a mips section create_fake_mips <- function() { guid <- st_guid() lid <- tolower(gsub("[{}]", "", guid)) mips_xml <- sprintf( ' true 2024-04-07T14:27:12Z Privileged General %s %s 0 ', guid, lid, guid, lid, guid, lid, guid, lid, guid, lid, lid, guid, lid, lid, guid, lid ) read_xml(mips_xml, pointer = FALSE) } fmips <- create_fake_mips() wb <- wb_workbook()$add_worksheet()$add_mips(xml = fmips) expect_message(wb_get_mips(wb, quiet = FALSE), "Found MIPS section: General") expect_equal(fmips, wb$get_mips()) tmp <- temp_xlsx() wb$save(tmp) expect_equal(fmips, wb_load(tmp)$get_mips()) wb <- wb_load(tmp) expect_message(wb$add_mips(xml = fmips), "File has duplicated custom section") expect_equal(fmips, wb$get_mips()) op <- options("openxlsx2.mips_xml_string" = fmips) on.exit(options(op), add = TRUE) wb <- wb_workbook()$add_worksheet()$add_mips(xml = fmips) wb <- wb_workbook()$add_worksheet()$add_mips() expect_equal(fmips, wb$get_mips()) wb <- wb_workbook() |> wb_add_worksheet() |> wb_set_properties( custom = list( Software = "openxlsx2", Version = 1.5, ReleaseDate = as.Date("2024-03-26"), CRAN = TRUE, DEV = FALSE ) ) wb <- wb_workbook()$add_worksheet()$ set_properties( custom = list(int = 1L) ) expect_silent(wb$add_mips()) exp <- "3" got <- rbindlist(xml_attr(wb$get_mips(single_xml = FALSE)[1], "property"))$pid expect_equal(exp, got) })