如何使用openxlsx
?
我的一个列有一个日期变量(例如21-08-2017
),如果使用Excel中的ctrl+c
进行复制,并且正常粘贴到其他位置,则显示为#######
(如果列宽为增加以显示Excel中的内容,它正常粘贴)。我想将重复性任务集成到我的代码中。以下是我现在正在使用的内容:
WB <- loadWorkbook(File)
addWorksheet(WB, Sheet)
writeDataTable(WB, Sheet, DF, withFilter=F, bandedRows=F, firstColumn=T)
saveWorkbook(WB, File, overwrite =TRUE)
我在这里附上了相关的全部代码,我也在根据表值进行条件格式化。 请建议一种在此处集成自动调整列宽的方法。
编辑: 默认情况下,R的XLSX输出具有默认的8.43列宽,我想根据单元格内容将其设置为自动调整,或者为每个列手动设置它。
To Mod:这是我试图在R中使用openxlsx解决的问题。无论如何,感谢关注。
答案 0 :(得分:10)
好的,我在文档中进行了另一次广泛搜索后得到了它。从网上解决方案的缺乏看来,很少有人真正使用这个......
setColWidths(WB, Sheet, cols = 1:ncol(DF), widths = "auto")
但是,这仍然没有给出所需的结果,日期列仍然有点短并显示########
;虽然列标题也不合适(因为它们的格式为粗体)。
编辑:
最后,选择添加c(7.5, 10, "auto", ...)
替换"auto"
,它不是完全动态的,但现在解决了这个问题。希望看到更好的答案。
答案 1 :(得分:4)
鉴于widths = "auto"
没有按照您的意愿工作,更广泛的答案是根据最长的值+ 2来分配宽度(以处理强化):
width_vec <- apply(DF, 2, function(x) max(nchar(as.character(x)) + 2, na.rm = TRUE))
setColWidths(WB, Sheet, cols = 1:ncol(DF), widths = width_vec)
并根据列标题指定宽度:
width_vec_header <- nchar(colnames(DF)) + 2
setColWidths(WB, Sheet, cols = 1:ncol(DF), widths = width_vec_header)
并根据每列最长的字符串分配宽度,无论是标题还是正文中的单元格,都使用“并行”最大函数(如矢量化最大函数):
width_vec <- apply(DF, 2, function(x) max(nchar(as.character(x)) + 2, na.rm = TRUE))
width_vec_header <- nchar(colnames(DF)) + 2
max_vec_header <- pmax(width_vec, width_vec_header)
setColWidths(WB, Sheet, cols = 1:ncol(DF), widths = max_vec_header )
答案 2 :(得分:1)
我遇到了与上述相同的问题,但是正在使用数据帧列表。使用tidyverse,我修改了Rick的答案以解决这个问题。我也不希望列宽超过75。这仍然不能解决上述日期问题。我不希望时间戳与日期一起显示,我发现您可以设置Excel中日期格式的选项。因此,我使用了options(“ openxlsx.datetimeFormat” =“ mm / dd / yyyy”)。有关格式化here
的更多信息myList <- list(A = data.frame(ID = c("AAA", "AAA"),
Test = c(1, 1),
Value = 1:2),
B = data.frame(ID = c("BBB", "BBB", "BBB"),
Test = c(1, 3, 5),
Value = 1:3),
C = data.frame(Test = c(1, 3, 5),
Value = 1:3))
data_cols <- myList %>%
map(~ 1:ncol(.), .depth = 2)
width_vec <- myList %>%
map(~ summarise_all(., funs(max(nchar(as.character(.)))), na.rm = TRUE), .depth = 2) %>%
map(~ unlist(., use.names = FALSE), .depth = 2) %>%
map(~ . + 2, .depth = 2)
width_vec_header <- map(myList, ~ nchar(names(.)) + 2, .depth = 2)
max_vec <- map2(width_vec, width_vec_header, ~ pmin(75, pmax(.x, .y, 0)), .depth = 2)
pwalk(list(names(myList), data_cols, max_vec), ~ setColWidths(wb, ..1, ..2, widths = ..3))
答案 3 :(得分:0)
使用XLConnect ...
setColumnWidths(WB, Sheet, column = 1:ncol(DF), width = -1)
参考: https://cran.r-project.org/web/packages/XLConnect/XLConnect.pdf