2017-03-09 11 views
2

xlsxパッケージを使用して、やや複雑な書式設定のExcelシートを作成しています。xlsx Rパッケージが以前の書式を上書きする

問題は、既に1つのセルをフォーマットしていて、その上に何かを追加したい場合です。追加している新しいものを除き、デフォルトに戻ります。

解決策の1つは、それぞれ異なるケースを指定し、完全な書式設定を適用することです。特定のケースの数は、大きなシートで制御不能になる可能性があります。

書式設定を段階的に追加する必要があると思いますが、まだドキュメントには何も見つかりませんでした。

物事の私の現在の方法の再現性の例:最後に

require(xlsx) 

# Some random data 
n <- 20L 
set.seed(1L) 
df <- data.frame(species = sample(c("Cat", "Dog", "Unkown"), n, replace = TRUE), 
       speed = abs(rnorm(n)) * 20L) 

# Create workbook 
dfwb <- createWorkbook(type = "xlsx") 
sheet <- createSheet(dfwb, sheetName = "ani") 
addDataFrame(df, sheet, startRow = 1, startColumn = 1, row.names = FALSE) 


# Change text of Cat to "red" 
row <- getRows(sheet, rowIndex = which(df[, "species"] == "Cat") + 1L) 
cel <- getCells(row, colIndex = 1) 
redh_style <- CellStyle(dfwb) + Font(dfwb, color = "red") 

for (i in names(cel)) { 
    setCellStyle(cel[[i]], redh_style) 
} 

# Highlight all rows where speed exceeds 18 
row <- getRows(sheet, rowIndex = which(df[, "speed"] > 18) + 1L) 
cel <- getCells(row, colIndex = 1:2) 
high_style <- CellStyle(dfwb) + Fill(foregroundColor="#E2E6EB") 

for (i in names(cel)) { 
    setCellStyle(cel[[i]], high_style) 
} 

# Save 
setwd("c:/temp/csvm/") 
saveWorkbook(dfwb, "so_cat.xlsx") 

、以前に赤いフォントの一部が黒に戻っています。

enter image description here

Psと。私は他のパッケージを試しましたが、xlsxに固執したいと思います。 XLConnectは、Rから直接いくつかの書式設定を許可しておらず、openxlsxを実行するのが技術的に困難です。

答えて

1

ここに1つのアプローチがあります。主な考え方は、各リスト要素がセルである各セルの形式の並行リストを作成することです。これにより、必要に応じて書式設定属性を追加することができます。最後に、各セルにこのフォーマットのリストを適用します。私たちは、選択したセルのためfmtsリストにフォント属性を追加し、最初の基準に従ってフォーマットし、今

# Set up blank list of formats 
fmts <- list() 

# Change text of Cat to "red" 
row <- getRows(sheet, rowIndex = which(df[, "species"] == "Cat") + 1L) 
cel <- getCells(row, colIndex = 1) 

for (i in names(cel)) { 
    if (i %in% names(fmts)) { 
    fmts[[i]] <- c(fmts[[i]], list(Font(dfwb, color = "red"))) 
    } else { 
    fmts[[i]] <- list(CellStyle(dfwb), Font(dfwb, color = "red")) 
    } 
} 

次の

まず、我々は空白のリストを設定しました、背景を行う:

# Highlight all rows where speed exceeds 18 
row <- getRows(sheet, rowIndex = which(df[, "speed"] > 18) + 1L) 
cel <- getCells(row, colIndex = 1:2) 

for (i in names(cel)) { 
    if (i %in% names(fmts)) { 
    fmts[[i]] <- c(fmts[[i]], list(Fill(foregroundColor="#E2E6EB"))) 
    } else { 
    fmts[[i]] <- list(CellStyle(dfwb), Fill(foregroundColor="#E2E6EB")) 
    } 
} 

私たちが検査するとき最後に

str(fmts, m = 1) 
# List of 16 
# $ 2.1 :List of 3 
# $ 6.1 :List of 3 
# $ 11.1:List of 2 
# $ 12.1:List of 3 
# $ 13.1:List of 2 
# $ 2.2 :List of 2 
# $ 5.1 :List of 2 
# $ 5.2 :List of 2 
# $ 6.2 :List of 2 
# $ 9.1 :List of 2 
# $ 9.2 :List of 2 
# $ 12.2:List of 2 
# $ 15.1:List of 2 
# $ 15.2:List of 2 
# $ 19.1:List of 2 
# $ 19.2:List of 2 

:3210は、我々は他の人が3(基本セルスタイル、フォント、背景)を持っている間、いくつかの要素が2つのだけのアイテム(基本セルスタイルに加え、フォントや背景を)持っていることに注意してくださいfmtsまで繰り返し、スタイルを適用します。 Reduce機能は便利で来る:

# Apply formatting 
for (i in names(fmts)) { 
    idx <- as.numeric(unlist(strsplit(i, "\\."))) 
    cel <- getCells(getRows(sheet, rowIndex = idx[1]), colIndex = idx[2]) 
    setCellStyle(cel[[i]], 
    Reduce(`+.CellStyle`, fmts[[i]]) 
) 
} 

出力:

enter image description here

+0

ニース。 'Reduce'を勉強しなければなりません。私は今のところこのような作業を実装しますが、受け入れる前にユーザーフレンドリーなものが到着するのを待つつもりです。 – snoram

関連する問題