R - 自动调整Excel列宽

时间:2017-08-24 11:09:52

标签: r excel copy-paste openxlsx

如何使用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解决的问题。无论如何,感谢关注。

4 个答案:

答案 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