web-dev-qa-db-ja.com

R-Excelの列幅を自動調整

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で解決しようとしている問題です。とにかく、ご清聴ありがとうございました。

9
Arani

わかりました。ドキュメントをもう一度詳しく検索したところ、わかりました。オンラインのソリューションが不足しているため、実際にこれを使用している人はほとんどいないようです...

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

ただし、これでも目的の結果は得られません。日付列はまだ少し短く、_########_を示しています。列ヘッダーも適合していません(フォーマットされているため太字)。

編集:

最後に、_"auto"_だけを置き換えてc(7.5, 10, "auto", ...)を追加することを選択しました。これは完全に動的ではありませんが、今のところ問題を解決します。より良い答えを見たいと思っています。

12
Arani

_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 )

5
Rick Pack

上記と同じ問題が発生しましたが、データフレームのリストを処理していました。 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))
2
Jenna Allen

XLConnectの使用...

setColumnWidths(WB, Sheet, column = 1:ncol(DF), width = -1)

参照: https://cran.r-project.org/web/packages/XLConnect/XLConnect.pdf

0
Steve