openxlsx
を使用して列幅を自動調整するにはどうすればよいですか?
私の列の1つに日付変数(例: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です。セルの内容に従って自動調整するように設定するか、列ごとに手動で設定します。
Modへ:これは、openxlsxを使用してRで解決しようとしている問題です。とにかく、ご清聴ありがとうございました。
わかりました。ドキュメントをもう一度詳しく検索したところ、わかりました。オンラインのソリューションが不足しているため、実際にこれを使用している人はほとんどいないようです...
_setColWidths(WB, Sheet, cols = 1:ncol(DF), widths = "auto")
_
ただし、これでも目的の結果は得られません。日付列はまだ少し短く、_########
_を示しています。列ヘッダーも適合していません(フォーマットされているため太字)。
編集:
最後に、_"auto"
_だけを置き換えてc(7.5, 10, "auto", ...)
を追加することを選択しました。これは完全に動的ではありませんが、今のところ問題を解決します。より良い答えを見たいと思っています。
_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 )
上記と同じ問題が発生しましたが、データフレームのリストを処理していました。 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))
XLConnectの使用...
setColumnWidths(WB, Sheet, column = 1:ncol(DF), width = -1)
参照: https://cran.r-project.org/web/packages/XLConnect/XLConnect.pdf