2

我想在我创建的 xlsx 文件的顶部添加两个空白行。

到目前为止,我已经尝试过:

library("xlsx")
fn1 <- 'test1.xlsx'
fn2 <- 'test2.xlsx'

write.xlsx(matrix(rnorm(25),5),fn1)

wb <- loadWorkbook(fn1)
rows <- getRows(getSheets(wb)[[1]])
for(i in 1:length(rows)) 
    rows[[i]]$setRowNum(as.integer(i+1))

saveWorkbook(wb,fn2)

但是test2.xlsx是空的!

4

2 回答 2

2

所以 xlsx 包实际上与一个 java 库接口,以便拉入和修改工作簿。read.xlsx 和 write.xlsx 函数是方便的包装器,用于在 R 中读取和写入数据帧,而无需手动编写代码来使用 java 对象自己解析各个单元格和行。loadWorkbook 和 getRows 函数使您可以访问实际的 java 对象,然后您可以使用它们来修改诸如单元格样式之类的内容。

但是,如果您只想在输出电子表格之前向其添加一个空白行,那么最简单的方法是在导出之前向您的数据框添加一个空白行(如 Chris 所述)。您可以在代码中使用以下变体来完成此操作:

library("xlsx")
fn1 <- 'test1.xlsx'
fn2 <- 'test2.xlsx'

# I have added row.names=FALSE because the read.xlsx function
# does not have a parameter to include row names
write.xlsx(matrix(rnorm(25),5),fn1,row.names=FALSE)

# If you read your data back in using the read.xlsx function
# you will have a data frame rather than a series of java object references
wb <- read.xlsx(fn1,1)

# Now that we have a data frame we can add a blank row at the top
wb<-rbind.data.frame(rep("",5),wb)

# Then we write to the file using the same function as before
write.xlsx(wb,fn2,row.names=FALSE)

如果您希望使用 java 库中的高级功能,其中一些当前未在 R 包中实现,因此您必须使用 .jcall 直接调用它。如果您决定采取这一行动,我绝对建议在生成的对象上使用 .jmethods(即 .jmethods(rows[[1]]),它将列出您可以在对象上使用的可用函数(在细胞级别这些是相当广泛的)。

于 2011-07-22T22:41:35.953 回答
2

我对您尝试对 for 循环执行的操作感到有些困惑,但是:

您可以创建一个与 wb 具有相同列数的虚拟对象,然后使用 rbind() 连接虚拟对象并使用 wb 创建 fn2。

fn1 <- 'test1.xlsx'
wb <- loadWorkbook(fn1)
dummy <- wb[c(1,2),]
# set all values of dummy to whatever you want, e.g. "NA" or 0
fn2 <- rbind(dummy, wb)
saveWorkbook( fn2)

希望有帮助

于 2011-06-30T00:35:25.690 回答