R - 自动调整 Excel 列宽

16
我如何使用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列宽,我想要将其设置为根据单元格内容自适应,或者手动为每一列设置宽度。
注:这是我正在使用openxlsx解决的问题。无论如何,感谢关注。
4个回答

29

好的,在另一次广泛搜索文档后我明白了。从网上解决方案的匮乏来看,似乎很少有人实际使用这个...

setColWidths(WB, Sheet, cols = 1:ncol(DF), widths = "auto")

然而,这仍然没有达到预期的结果,日期列仍然有点短,并显示为########;而列标题也不适合(因为它们是以粗体格式化的)。

编辑:

最后,选择添加 c(7.5, 10, "auto", ...) 替换只有 "auto",虽然不完全动态,但现在解决了这个问题。希望能看到更好的答案。


2
“编辑”下的想法很好。它考虑到单元格内容可能具有不同的字体大小,但是使用<code>widths = c("auto", "auto", "auto",...)</code>可以自动调整单元格宽度以适应字符串大小和长度。干得好! - Yannik Suhre

17

考虑到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)

基于每列中最长字符串(无论是标题还是正文单元格)来分配宽度,请使用“parallel”最大函数(类似于向量化的最大函数):
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 )


明天我会查看并告诉你。谢谢。 - Arani
1
输入很好,但如果列是例如c(0.001, 1000.000),则无法正常工作。 - Michael M
如果“+2”无法提供足够的宽度,请尝试“+8”。这在今天运作良好,可能是由于软件包更改的原因。 - Rick Pack

2

2
我遇到了与上面相同的问题,但我使用的是数据框列表。使用tidyverse,我修改了Rick的答案以解决这个问题。我也不想要列宽超过75。这仍然没有解决上述描述的日期问题。我不想在我的日期中显示时间戳,我发现你可以设置Excel中日期格式的选项。因此,我使用options("openxlsx.datetimeFormat" = "mm/dd/yyyy")。有关格式化的更多信息,请单击此处。最初的回答。
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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接